2016-04-27 104 views
2

我知道什么是在C.短路评价&& ||短路评估操作者

a && b

a || b(操作数B不是若a = 0检查)(操作数B未选中若a =非零)

但我被困在这个问题

int x = 0; 
if (5 || 2 && ++x) 
    printf("%d", x); 

这输出0

我的第一个想法去如下:

根据优先顺序表,优先为++&&||(降序)

  1. ++xevaluated.x变为1

  2. 2 && ++x评估。两个操作数都被评估。

  3. ||被评估。

但根据这一点,1应打印,不0

我的第二个想法,就如同:

5 || anything 

anything因为短路评价不计算,所以没有优先进场这里。

回答

4

表达5 || 2 && ++x相当于5 || (2 && ++x)由于操作者的优先级。

运行时间从左到右评估表达式5 || 2 && ++x

正如我们所知,如果第一个条件为真,它将不检查第二个条件。
所以这里5评估为真,因此(2 && ++x)将不会执行。

这就是为什么x在这里保持0的原因。

3

正确。表达式被短路。你可以用这个来测试它。

if(5 || ++x) { 
    printf("%d\n",x); 
}