【发布时间】:2021-07-20 09:30:15
【问题描述】:
我开始学习用 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 中存储的值不是分配在括号中的值,但它也不只是从左到右读取,因为在这种情况下会有没有运算符优先级。它是如何工作的?
【问题讨论】:
-
表达式
printf("Number is %d", i) + (i = 5)是无序的,是先调用printf,还是添加i + 5?此类序列问题会导致未定义的行为。 -
这里我们应该了解“关联”属性
标签: c operators conditional-operator