c - 使用逻辑运算符和前/后增量无法从此代码中获得预期输出

标签 c logical-operators post-increment pre-increment

我在以下 C 代码中没有得到预期的输出

main(){
    int i=0,j=-2,k=0,m;

    if((!i||--j&&k++)&&(i++||j++&&!k++))
    {
        printf("i=%d j=%d k=%d",i,j,k);

    }
    return 0;
}

我在编译器中得到的输出为:

i=1 j=-1 k=1

但我不明白这里到底发生了什么。

我认为 if 语句不应该运行,因为它的参数是 false

注意第一个括号(!i||--j&&k++)

此处为 !i=1 因此此括号为 true,因为 OR 运算符下任何带有 1 的内容都将为 true。

输出值变为:i=0, j=-3, k=1

现在请注意第二个括号:(i++||j++&&!k++)

这里我们有 ( 0 || -3 && !1) = 0, false

由于括号之间用&&分隔,因此if语句的整个参数变为false

请解释一下我的论点哪里错了。我是 C 新手

最佳答案

逻辑 AND 运算符 && 和逻辑 OR 运算符 || 是短路运算符,这意味着如果表达式的结果是,则不会计算右侧可以从左侧确定。

所以当这个子表达式运行时:

(!i||--j&&k++) 

解析为:

(!i||(--j&&k++)) 

|| 的左侧求值为 true,因此 --j&&k++ 不求值,这意味着 j 的值仍然是 - 2,k 的值保持为 0。

所以最外面的&&的左边是true,所以现在我们评估右边:

(i++||j++&&!k++)

解析为:

(i++||(j++&&!k++))

i 递增到 1,然后在 || 中使用旧值。旧值 0 的计算结果为 false,因此计算右侧。 j 递增到 -1,旧值 -2 计算结果为 true,因此计算 && 的右侧。 k 增加到 1,旧值 0 应用于 ! 运算符,其计算结果为 true。这使得整个表达式为 true,并且打印该语句,此时 i 为 1,j 为 -1,k 为 1。

关于c - 使用逻辑运算符和前/后增量无法从此代码中获得预期输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57795317/

相关文章:

javascript - 为什么 JavaScript 中没有逻辑异或?

c - 为什么交换变量名会改变 C 程序的输出?

c - 为什么 i+++ 工作正常但+++i 给出错误?

c - 二维字符数组(将带有空格键的文本存储在一个字符数组元素中?)

c - Inotify:仅监视文件夹内的某些文件

python - 如何在 python 中自动将条件组合在一起?

奇数的Python逻辑测试

java - 何时在 Java 中使用后增量和前增量

c++ - 使用 loadappinit_dlls 注册表项将 dll Hook 到正在运行的进程中

c - 开发 iptables 模块的最佳方法是什么