1

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

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

这个表达式是如何计算的?

4

1 回答 1

4

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

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

2 || 1 / 0

被隐式括起来

2 || (1 / 0)

作为表达式树:

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

优先级决定了树的形状,但评估的顺序独立于优先级(除非优先级决定了数据依赖关系)。对于某些运算符(||, &&, ?:, ,),操作数的计算顺序是指定的[如果在计算左操作数和第二个和第三个操作数之后已经确定结果,则根本不计算||and的右操作数&&的操作数?:,只有一个被评估 - 哪个是由第一个操作数的评估决定的],通常操作员节点的子节点的评估顺序是未指定的。

由于 in 的左操作||

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

(常量表达式2)的计算结果为非零值,表达式的计算在此停止,值为

2 || 1 / 0

是 1。

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

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

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

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

于 2013-05-15T12:37:57.010 回答