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

标签 c expression logical-operators

<分区>

复合逻辑AND/OR 表达式中的各个表达式不是应该在逻辑运算符应用于它们的结果之前先求值吗?为什么是++km =++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 条件始终为真,因此不会评估 ++k,因为 && 是一个捷径然后|| 是一个捷径否则 (所以他们可能不会评估他们的正确操作数)。

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

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

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

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

相关文章:

javascript - 为什么 typeof 只是有时抛出 ReferenceError?

c - 一旦对命令行参数使用 printf() ,它们会发生什么?

c - libgit2 中的 git_sysdir_find_in_dirlist() 是做什么的?

c - 如何编写一个在手机上运行的c程序?

c - 用链表实现的任意索引处的序列插入

java - 是否有用于解析 "number expressions"的库,如 1,2-9,33- 在 Java 中

vb.net - 用于循环类属性的 Lambda 表达式

c - 逻辑运算符、表达式和条件语句( bool 值)

python - 有没有一种巧妙的方法可以在 IF 语句中对两个条件执行异或运算?

objective-c - Objective-C if 语句中的感叹号是什么意思?