C中的OR和AND运算

Ang*_*gus 6 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;
}
Run Code Online (Sandbox Code Playgroud)

我把输出作为-2 2 0 1.

在或运算,如果第一个值是真实的,那么它不会评价:第二个这样i = -2j =2.然后是AND操作.它会检查两个值是否为真.如果那样的k = 1m = 1.所以输出应该是-2 2 1 1.我跑,检查并得到输出,-2 2 0 1但我无法理解如何.

Mik*_*ola 8

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

还要注意短路运算符,|| 和&&,是左联的和那|| 优先级高于&&.结果,|| 获得第一评估,及早出局,如果左侧的值为true,如果左边的计算结果为假,而&&早出局.

编辑:修正了解释优先级的错误.

  • 关联性逻辑OR和逻辑AND都具有相关性,因为它们没有相同的优先级.逻辑AND的优先级高于逻辑OR._That_是不评估++ k的原因. (2认同)

Mic*_*kis 6

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