#include <stdio.h>
int main()
{
int k=5;
if(++k < 5 && k++ / 5 || ++k <= 8)
{
printf("%d",k);
}
return 0;
}
为什么输出的是7而不是8?(我是编程初学者所以请多多包涵。)
最佳答案
Operator precedence和逻辑表达式 short circuit evaluation .
&&
在您的逻辑条件下,绑定(bind)比 ||
更紧密,所以你的条件相当于:
((++k<5 && k++/5) || ++k<=8)
以结构化方式呈现的代码更容易阅读,如下所示:
int main() {
int k=5;
if ((++k<5 && k++/5) || ++k<=8) {
printf("%d",k);
}
return 0;
}
现在逐个执行。
-
k
5 点开始。 -
++k<5
预付款k
到 6,不是<5
. - 下半场
&&
表达式永远不会被评估,因为0 && ANYTHING == 0
. - 因为
||
的左侧为 0,右侧未短路。必须对其进行评估。 -
++k<=8
预付款k
到 7,是<=8
. - 总条件计算结果为 1,因为
||
的右侧是 1。 if
的“then”子句语句被执行。k
的当前值,即 7,被打印出来。- 程序返回 0,并终止。
还值得注意的是,您的 &&
的后半部分子句可能没有按照您的意图进行。 k++/5
是整数除法,并且由于 k>5
在任何时候,k++/5
永远是>=1
因此总是正确的。
关于c - 基本逻辑运算符问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25577166/