这个常量表达式是如何评估的?

时间:2013-05-15 12:21:48

标签: c operators language-lawyer c11

在解释常量表达式时,标准(好吧,草稿N1570)给出了“启发”的例子:

  

118)
  因此,在下面的初始化中,
       static int i = 2 || 1/0;
  表达式是一个有效的整数常量表达式,其值为1。

如何评估此表达式?

1 个答案:

答案 0 :(得分:4)

逻辑或,||总是返回0或1.首先计算其左操作数,然后,如果左操作数的计算结果为0,则评估右操作数和表达式的值如果右操作数也计算为0,则为0,否则为1。如果左操作数的计算结果为非零值,则整个表达式的计算结果为1而不评估右操作数。

除法运算符/的优先级高于逻辑或表达式

的优先级
2 || 1 / 0

隐式括号

2 || (1 / 0)

作为表达式树:

     (||)
    /    \
   2     (/)
        /   \
       1     0

优先级确定树的形状,但评估顺序与优先级无关(除非优先级确定数据依赖性)。对于某些运算符(||&&?:,),指定了操作数的评估顺序[以及||的正确操作数和如果在评估左操作数以及&&的第二和第三个操作数之后已经确定结果,则根本不评估?:,只评估一个操作数 - 哪一个由评估确定在第一个操作数]中,通常不指定运算符节点的子节点的计数顺序。

由于||的左操作数在

static int i = 2 || (1 / 0);

(常量表达式2)计算为非零值,表达式的计算结果停在那里并且值

2 || 1 / 0

是1。

||的评估在第6.5.14节第4段中规定:

  

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

及其返回值同上,第3段:

  

||运算符如果其任一操作数比较不等于0,则应得1;否则,它产生0.结果的类型为int