在解释常量表达式时,标准(好吧,草稿N1570)给出了“启发”的例子:
118)
因此,在下面的初始化中,
static int i = 2 || 1/0;
表达式是一个有效的整数常量表达式,其值为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
。