检查条件的语义

Ice*_*man 4 c

如果我有这样的条件:

if (X && Y) {}
Run Code Online (Sandbox Code Playgroud)

编译器会检查Y是否X为false?它是编译器依赖的吗?

Thi*_*ter 10

在C和大多数其他语言中,保证短路评估.因此Y,仅在X评估为true时进行评估.

这同样适用于X || Y- 在这种情况下Y,仅在X评估为false时进行评估.

请参阅Mike的答案,以获取对C规范的引用,其中提到并保证了此行为.

  • 一点都不.这实际上是可怕的:`if(x && x-> foo)` - 如果`x`为NULL会怎么样? (2认同)

Mik*_*ike 7

C规范(6.5.13)为您澄清了这一点:

4与按位二进制和运算符不同,&&运算符保证从左到右的评估 ; 如果计算第二个操作数,则在第一个和第二个操作数的计算之间存在一个序列点.如果第一个操作数比较等于0,则不计算第二个操作数.

所以C语言本身定义了如果X == 0那么Y不会被检查.