评估 C 中的后缀和逻辑运算符,无需采用短路方法

问题描述 投票:0回答:1

我在学习C中的逻辑运算符和条件时遇到了这个问题。

#include <stdio.h>
int main() {

    int x = 3;
    int y = 2;
    int z = 3;
    printf("Result #4 = %d\n", x++ <= 3 || y++ >= 2 && z++ != 3);
    printf("x: %d y: %d z: %d\n", x, y, z);
    return 0;

}

输出:

Result #4 = 1
x: 4 y: 2 z: 3

我不明白输出的最后一行。 x、y、z 的值与我的理解不符。

这是我的想法。

  • 表达式 x++ <= 3 || y++ >= 2 && z++ != 3 的计算方式如下:x++ <= 3 || (y++ >= 2 && z++ != 3)。
  • 然后,y++ >= 2 将为 true,并且 y 值将增加到 3。
  • 那么,z++ != 3 将为 false,z 值将增加到 4。
  • 由于整个条件为假,因此将评估 OR 条件的 RHS。
  • 所以,x++ <= 3 will be evaluated to true and x will be incremented to 4.
  • 自 x++ 起,整个条件将为真 <= 3 will be evaluated as true.

我试图找到该问题的参考教科书或工作表,但我找不到。我在 StackOverflow 上做了一些研究,我不认为这是一种短路情况。如果是的话,我不明白为什么。

我能想到的唯一解释是 x 值将实现副作用(x 递增),因为它被评估为 true,而 OR 语句的其余部分不会有副作用,因为它被评估为 false ,因此 y 和 z 不会增加。是这样吗?

c conditional-statements postfix-operator
1个回答
0
投票

表达式

x++ <= 3 || y++ >= 2 && z++ != 3
将被计算为:
x++ <= 3 || (y++ >= 2 && z++ != 3)

如果您用括号来思考,那么为什么您只在右侧使用它们而不在另一侧使用它们?该表达式将被评估为

(x++ <= 3) || (y++ >= 2 && z++ != 3)

为什么你认为首先评估右侧?

© www.soinside.com 2019 - 2024. All rights reserved.