c - 具有整数增量的 bool 表达式给出意想不到的结果

标签 c increment boolean-expression side-effects

    #include <stdio.h>
    int main()
    {
       int x, y, z; 
       x=y=z=1; 
       z = ++x || ++y && ++z; 
       printf("%d, %d, %d", x, y,z);
       return 0;
    }

我得到输出 2, 1, 1。我需要解释为什么输出中 Y 为 1?

最佳答案

|| 运算符是短路;如果左操作数求值,则不会计算右操作数(并且永远不会执行副作用,即变量永远不会递增)到!= 0。

(请记住,“乘法先于加法”,或者在 bool 逻辑中 AND 位于 OR 之前。由于运算符优先,表达式变成完全括起来的 (++x) || ((++y) && (++z));换句话说,|| 右侧的所有内容都是 OR 被忽略的右侧。)

左操作数++x的计算将x增加到2。z被赋予结果的 bool 值>|| 一直都是 1。

<小时/> 顺便说一句,gcc 发出了警告,我认为该声明确实也是未定义行为。 C 11 标准草案 n1570 6.5/2 中说:

If a side effect on a scalar object is unsequenced relative to [...] a value computation using the value of the same scalar object, the behavior is undefined.

标准为此给出了i =++i + 1;的示例。在您的右侧表达式 z 中扮演这个角色。副作用是增量,值计算是 && 子表达式。

<小时/> 1 只要右侧从未被评估,它就有可能被定义(即我不确定)。在这种情况下,编译器将被允许假设 ++x 永远不为 0 并省略测试。复杂 bool 表达式的生成代码将归结为 x 的增量。

关于c - 具有整数增量的 bool 表达式给出意想不到的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40747843/

相关文章:

C - union 输出到屏幕和文本文件

c++ - 有没有办法从 C++ 中区分文件?

database - 增加标签

java - 在 Java 中返回递增的数字

javascript - 条件与运算符 (&&) 可以包含 2 个以上的操作数吗?

c - 返回 Void 指针截断值

c - 这个汇编语句是什么意思?

c - 为什么这些构造使用增量前和增量后未定义的行为?

python - 使用 bool 选择选择一个dataframe,然后提取某一列对应的值

javascript - bool 表达式 - 与 AND、OR 逻辑运算符混淆以及它们的工作原理