关于 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 > 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
在同一个表达式中既读又写,没有序列点。这样做会触发 undefined behavior。这也适用于:
(i = 5) + printf(Numer is %d, i);
顺便说一下,这个:
a > b ? c = a : (c = b);
可以更清楚地写成:
c = a > b ? a : b;
我开始学习用 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 > 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
在同一个表达式中既读又写,没有序列点。这样做会触发 undefined behavior。这也适用于:
(i = 5) + printf(Numer is %d, i);
顺便说一下,这个:
a > b ? c = a : (c = b);
可以更清楚地写成:
c = a > b ? a : b;