学习时只有3天C.在书中注意到这一点:
int main() {
int x = 10, y = 15;
if (x % 2 == y % 3) {
printf("Which one x%2 or y%3 calculated first");
}
}
我的问题是条件。问题是首先计算哪个表达式,x%3或y%3?
答案 0 :(得分:3)
简短的回答是:C没有指定首先计算x % 2
和y % 3
中的哪一个,并且因为在任何一个子表达式中都没有副作用,所以无关紧要。
答案很长:实际上,查看Godbolt Compiler Explorer上生成的代码,可以在编译时计算表达式,而这些表达式都不会在运行时计算。
很少有C运营商有明确的评估顺序:
,
&&
和逻辑或||
以及三元运算符?
:
(如果第一个有第二个或第三个操作数,它们实际上只评估它们的第二个或第三个操作数特定真值)。答案 1 :(得分:1)
我是一个棘手的问题,它在前一段时间的采访中非常受欢迎。
如果我这个例子有点不那么简单并且避免优化:
int comapare(int x, int y) {
int result;
if (result = (x % 2 == y % 3)) {
printf("Which one x%%2 or y%%3 calculated first");
}
return result;
}
此特定的评估顺序未确定,因为只从左到右保证逻辑运算符,并评估确定表达式结果所需的最小操作数。运算符==
以及所有其他比较运算符 不是 逻辑运算符。
大多数受访的候选人回答说,它将从左到右进行评估,因为这是合乎逻辑的操作。
答案 2 :(得分:-4)
这是一个很好的问题Gaurav。总是有那种好奇心,因为你可以如何获得真正的学习。
正如评论中所建议的,这个问题与运营商偏好和相关性有关。
Here you can get an idea in general.
Here, it's more specific to your question。正如你在那里看到的那样(第3点),对于%
运算符,它是从左到右。
重要的是要区分等式==如何工作与赋值运算符=作为后者从右到左的作用。如该链接所述,对于=
等作业运算符,表达式a=b=c
被解析为a=(b=c)
,而不被解析为(a=b)=c
,因为从右到左的相关性。
希望这会清除你的怀疑!
其他说明:
根据评论部分的后续讨论,我认为有必要消除一些混淆。
关于运营商关联性和评估顺序的困惑:
如果两个运算符具有相同的优先级,则运算符的关联性决定了它们的执行顺序。 ==
的关联性是从左到右,即左边的表达式首先执行并向右移动。因此,回答方程式x % 2 == y % 3
中首先计算哪个表达式的问题,答案如下:
1。评估x % 2
。
2。评估y % 3
。
3。评估==
编译器是否严格遵循此规则?
不一定。编译器可以任意顺序评估这些表达式,如果它们可以保证一致的结果。只有顺序评估(,),逻辑 - 和(&&),逻辑 - 或(||),条件表达式(?:)和函数调用运算符构成序列点,因此保证特定的顺序评估他们的操作数。