&&和|| 运营商

use*_*743 3 c boolean operators

我遇到了这段代码:

    int main()
    {
        int i=1,j=2,k=0,m=0;
        m = ++i || ++j && ++k;
        printf("%d %d %d %d %d",i,j,k,m);
    }
Run Code Online (Sandbox Code Playgroud)

该程序返回2 2 0 1....为什么?

&&具有更高的优先级高于||所以++j && ++k应先评估.因此我会期待j=3k=1.它将返回true,因此||变为true,因此++i不应进行评估.但它以其他方式工作.

我希望别人向我解释.

R. *_*des 11

具有更高的优先级并不意味着它首先得到评估.它只是意味着它更紧密.在该示例中,该表达式等同于:++i || (++j && ++k).首先评估的是++i因为||从左到右进行评估.只有当评估为false时才会++j && ++k评估,因为它||是短路的.

  • `S /优先级/优先级/` (3认同)

cni*_*tar 9

实际上++i将首先进行评估.只有当它是错误的时候才会评估右侧(在你的情况下,它不是).

"&&具有更高优先级"的事实涉及优先级(其操作数与其紧密相关的程度)而非"其操作数首先得到评估".

因为&&确实||在表中,表达式将被解释为:

m = ++i || (++j && ++k)
Run Code Online (Sandbox Code Playgroud)