哪个会先计算?

时间:2017-08-08 15:38:17

标签: c

学习时只有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?

3 个答案:

答案 0 :(得分:3)

简短的回答是:C没有指定首先计算x % 2y % 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。评估==

  • 编译器是否严格遵循此规则?
    不一定。编译器可以任意顺序评估这些表达式,如果它们可以保证一致的结果。只有顺序评估(,),逻辑 - 和(&&),逻辑 - 或(||),条件表达式(?:)和函数调用运算符构成序列点,因此保证特定的顺序评估他们的操作数。

  • 真实参考:https://msdn.microsoft.com/en-us/library/2bxt6kc4.aspx