C中的OR和AND运算

时间:2011-06-25 06:56:16

标签: c logical-operators

我对以下计划有疑问。

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 2 0 1

在OR操作中,如果第一个值为真,那么它将不会评估第二个值i = -2j =2。 然后是AND操作。它会检查两个值是否为true。如果k = 1则为m = 1。 所以输出应该是-2 2 1 1。我运行并检查输出为-2 2 0 1,但我无法理解。

2 个答案:

答案 0 :(得分:8)

你使用了短路或。由于++ i的计算结果为-2,它不是0,因此它会短路并且不会评估表达式的其余部分。结果,j或k都不会增加。

还要注意短路运算符,||和&&,是左联想的和那个||优先级高于&&。结果,||首先评估,如果左侧评估为真,则提前评估,而&&如果左侧评估为假,则提前退出。

编辑:修正了解释优先权的错误。

答案 1 :(得分:6)

评估||后没有任何内容,因为表达式++i的结果非零。