c - 关于C中运算符优先级的问题
问题描述
我开始学习用 c 编程,我以为我已经对运算符的优先级很有信心,直到我这样做:
a > b ? c = a : (c = b);
当然,第一次我没有在最后一句话上使用括号,但由于这最终导致了编译问题,我在这个论坛上搜索了如何解决这个问题,我读到添加括号可以完成这项工作。但是,我认为括号内的表达式在同一行中的任何其他内容之前执行,这意味着c = b
先执行句子,然后执行三元运算符。我做了一些类似但更容易阅读的事情,以便更好地了解这个运算符优先级发生了什么,并尝试执行这一行:
printf("Number is %d", i) + (i = 5);
我知道这个表达式返回一个值,但是因为我不需要它,而且这不是我将保留超过 5 秒的行,所以我不会将它存储在任何变量中。在这种情况下引起我注意的是,当我执行代码时,我并没有以值 5 显示在屏幕上,而是使用以前的值,这意味着计算机只是从左到右读取它正确的。当我做:
(i = 5) + printf(Numer is %d, i);
它首先进行 i 的赋值,然后才执行 printf 函数。我的问题是:计算机如何执行使用不同优先顺序的运算符的表达式?它显然不会首先运行具有最高优先级的运算符,因为在第一个 printf 中存储的值不是分配在括号中的值,但它也不只是从左到右读取,因为在这种情况下会有没有运算符优先级。它是如何工作的?
解决方案
括号和运算符优先级仅指示操作数的分组方式。它不规定评估的顺序。
在这个表达式中:
a > b ? c = a : (c = b);
三元运算符的三个部分分别是a > b
、c = a
和c = b
。该运算符还具有根据第一个子句的结果仅评估第二个和第三个子句中的一个的属性。从形式上讲,在第一个子句的评估与第二个或第三个子句的评估之间存在一个顺序点。所以a > b
首先评估。如果它不为零,c = a
则进行评估,否则c = b
进行评估。
在这个表达式中:
printf("Number is %d", i) + (i = 5);
没有什么可以规定是否先评估printf("Number is %d", i)
或i = 5
先评估。与三元运算符不同,运算符的操作数的求值之间没有序列点+
。这个表达式也有一个问题:i
在没有序列点的同一个表达式中读取和写入。这样做会触发未定义的行为。这也适用于:
(i = 5) + printf(Numer is %d, i);
顺便说一句,这是:
a > b ? c = a : (c = b);
可以更清楚地写成:
c = a > b ? a : b;
推荐阅读
- aws-api-gateway - 如何连接到在 Fargate 上运行的 ECS 服务?
- mysql - 通过powershell安装Mysql.msi时出现以下错误
- awk - 从 awk 中的输入文件计算百分比和等级
- c++ - C++ 从标准输入读取文件名
- c# - C#:从 .ashx 站点下载 .jpg
- c# - 如何使用 C# 中的 TestStack 库来使用击键,例如 SHIFT + RETURN
- html - 我想从其中的 img 中删除链接样式
- html - 如何垂直对齐 td 内的浮动表格
- c# - C# 和 SQLite:不从数据库加载表
- javascript - 父母与孩子的沟通没有按预期工作