以下程序的输出并不像我预期的那样。请向我解释逻辑表达式在该程序中的工作原理。
#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,1,1 输出为-2,2,0,1 为什么j和k没有增加
答案 0 :(得分:10)
因为++ i不为零,因此为真,语句的评估停止并返回true
即
true || (++j && ++k)
始终为true,并且无需在||之后计算位,即为真因此它不会改变j或k
答案 1 :(得分:2)
j
的短路功能, k
和||
没有递增。评估++i || ++j && ++k
后++i
评估为非零(意味着为真)。
答案 2 :(得分:2)
当你有一个布尔表达式时,它的一部分可能足以得到结果。例如,-2 || 3 && 1
与(-2) || (3&&1)
相同。因此,如果(-2)
产生true
,则整个表达式产生true
,并且不需要评估表达式的其余部分。这样,++j && ++k
永远不会被执行。
您可能还想尝试一下:
#include<stdio.h>
int main()
{
int i=-3, j=2, k=0, m;
m = ++j && ++k || ++i;
printf("%d, %d, %d, %d\n", i, j, k, m);
return 0;
}
答案 3 :(得分:1)
如果我是对的(有人纠正我,如果我错了),它会评估++ i(返回一个非零值),所以++ i是&#34; true&#34;,编译器看到||,&#34; true&#34;在它之前的表达式,所以它跳过行并返回&#34; true&#34; (1)。该程序从不执行++ j,也不执行++ k。