#include <stdio.h>
int main()
{
int k=5;
if(++k < 5 && k++/5 || ++k <= 8)
{
printf("%d",k);
}
return 0;
}
为什么是7的输出,而不是8?(我是一个初学者在编程所以请多多包涵。)基本的逻辑运算问题
#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。
在你的逻辑条件的&&
结合比||
更紧密,所以你的条件等同于:
((++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
advance k
to 7,其中是<=8
。||
右手边是1if
语句的WHERE子句被执行。k
,即7。还值得注意的是,&&
条款的后半部分可能没有达到您的要求。 k++/5
是整数除法,并且因为k>5
在任何时候,k++/5
将始终为>=1
,因此始终为真。
谢谢,Jonathan Eunice。 – user147699 2014-08-30 01:15:49
不客气@ user147699。如果您认为这回答了您的问题,请点击左上方的复选标记以“接受”答案。 – 2014-08-30 19:51:09
我很确定这个特定代码的输出是未定义的。在同一语句中对同一变量执行多个增量是C和C++的经典“未定义行为”。它可能会炸毁太阳,仍然是“正确的”。 – Telastyn 2014-08-29 19:57:29
,因为未定义的行为,这意味着*任何*可能发生在打印7或8以擦除硬盘 – 2014-08-29 19:58:28
@Telastyn:'&&'和'||'处有一个序列点,因此此代码具有明确定义的语义。 – mafso 2014-08-29 22:50:32