c - 为什么当 "k"计算结果为 true 时,语句 "m =++i &&++j ||++k"中的 "++i&&++j"不增加?

标签 c expression logical-operators

复合逻辑 AND/OR 表达式中的各个表达式不是应该在逻辑运算符应用于其结果之前先进行计算吗?为什么是 ++k完好无损m = ++i && ++j || ++k对于以下程序:

 #include<stdio.h>

 int main()
 {
      int i=-3, j=2, k=0, m;
    m = ++i && ++j || ++k;
    printf("%d, %d, %d, %d\n", i, j, k, m);
    return 0;
}

输出: -2,3,0,1

但我期望输出 -2,3,1,1

最佳答案

您应该避免编写此类不可读的代码。它实际上被解析为

m = (++i && ++j) || ++k;

因此,一旦 j >= 0++j 条件始终为 true,因此不会评估 ++k,因为 && 是一个快捷方式 然后,但 || 是一个快捷方式 or else (因此他们可能不会评估正确的操作数)。

因此 && 的计算如下:计算左操作数,如果为 false 则返回,然后仅当为 true(即不等于 0 )时计算右操作数并作为计算结果返回&& 。同样,|| 的计算如下:计算左操作数。如果为真(非零),它将成为 || 的结果;否则右操作数被计算并且是 || 表达式的结果。

特别是,在编码 if (x > 0 && 20/x < 5) 时,永远不会尝试对 x==0 进行除法。

另请阅读维基百科 operators in C & C++ & short circuit evaluation & lazy evaluation 页面;请花几个小时阅读一本好的 C 编程书籍。

关于c - 为什么当 "k"计算结果为 true 时,语句 "m =++i &&++j ||++k"中的 "++i&&++j"不增加?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16271779/

相关文章:

c - 是否有安全的方法来检查 pthread 是否存在?

python - UDP python 到 c 打包的二进制数据 - struct.pack ('<ff' ,

C# 我在寻找用于运行时属性替换的 Lambda/Expression/Func/Reflection 的什么构造?

java - 使用 Java 的表达式求解器算法

r - 是否以相同的顺序对向量值进行逻辑检查

c - 小于 FLT_EPSILON 的最大数字是多少?

c - 将 malloc 用于结构的多维数组

c# - 为 Linq 生成一个参数来处理日期范围

javascript - html5如何用倒置的背景颜色进行描边?

logical-operators - 逻辑运算符 A & (~B) 的名称