这个布尔表达式如何工作

时间:2014-08-15 15:49:54

标签: c

以下程序的输出并不像我预期的那样。请向我解释逻辑表达式在该程序中的工作原理。

#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没有增加

4 个答案:

答案 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。