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