关于 C 中运算符优先级的问题

Question regarding operator precedence in C

我开始学习用 c 语言编程,我认为我已经对运算符的优先级非常有信心,直到我这样做:

a > b ? c = a : (c = b);

当然,我第一次没有在最后一句话上使用括号,但是因为这最终导致了编译问题,所以我在这个论坛上搜索了如何解决这个问题,我读到添加括号可以解决这个问题.但是,我认为括号内的表达式先于同一行中的任何其他内容执行,这意味着先执行 c = b 语句,然后再执行三元运算符。我做了一些类似但更容易阅读的事情,以便更好地了解这个运算符优先级发生了什么,并尝试执行这一行:

printf("Number is %d", i) + (i = 5);

我知道这个表达式 returns returns 一个值,但是因为我不需要它而且这不是我会保留超过 5 秒的行,我不会' t 将其存储在任何变量中。在这种情况下引起我注意的是,当我执行代码时,我没有在屏幕上显示值 5,而是使用以前的值,这意味着计算机只是从左到右读取它正确的。当我这样做时:

(i = 5) + printf(Numer is %d, i);

它首先对 i 进行赋值,然后才执行 printf 函数。我的问题是:计算机如何执行使用不同优先级运算符的表达式?它显然不是 运行 first 具有最高优先级的运算符,因为在第一个 printf 中存储的值不是括号中分配的值,但它也不只是从左到右读取,因为在在这种情况下,将没有运算符优先级。它是如何工作的?

括号和运算符优先级仅规定操作数的分组方式。它不规定求值顺序

在这个表达式中:

a > b ? c = a : (c = b);

三元运算符的三部分分别是a > bc = ac = b。此运算符还具有 属性,即仅根据第一个子句的结果评估第二个和第三个子句中的一个。正式地说,在第一个子句的评估与第二个或第三个子句的评估之间有一个 序列点 。所以 a > b 首先被评估。如果它非零,则计算 c = a,否则计算 c = b

在这个表达式中:

printf("Number is %d", i) + (i = 5); 

没有任何内容决定先计算 printf("Number is %d", i) 还是 i = 5。与三元运算符不同,+ 运算符的操作数求值之间没有序列点。这个表达式也有一个问题:i在同一个表达式中既读又写,没有序列点。这样做会触发 undefined behavior。这也适用于:

(i = 5) + printf(Numer is %d, i);

顺便说一下,这个:

a > b ? c = a : (c = b);

可以更清楚地写成:

c = a > b ? a : b;