C中三元运算符的评估顺序
Order of evaluation for ternary operator in C
我知道根据标准,应该避免 fun(++a, a)
,因为第二个参数没有明确定义。
但是,这个配方安全吗:
(++a ? a : 10);
我测试了这个片段,它按预期工作,ie 对于 a = -1
它评估为 10
,对于任何其他 a
它的计算结果为 a+1
。这是在标准中明确定义的,还是很大程度上取决于编译器?
这个定义很明确。
在三元表达式中,首先计算第一部分。然后根据该值, 评估第二部分或第三部分。所以 ++a
保证在 a
可能被评估之前被评估。
这在 C standard 的第 6.5.15p4 节中有解释:
The first operand is evaluated; there is a sequence point between its evaluation and the evaluation of the second or third operand (whichever is evaluated). The second operand is evaluated only if the first compares unequal to 0; the third operand is evaluated only if the first compares equal to 0; the result is the value of the second or third operand(whichever is evaluated), converted to the type described below.
我知道根据标准,应该避免 fun(++a, a)
,因为第二个参数没有明确定义。
但是,这个配方安全吗:
(++a ? a : 10);
我测试了这个片段,它按预期工作,ie 对于 a = -1
它评估为 10
,对于任何其他 a
它的计算结果为 a+1
。这是在标准中明确定义的,还是很大程度上取决于编译器?
这个定义很明确。
在三元表达式中,首先计算第一部分。然后根据该值, 评估第二部分或第三部分。所以 ++a
保证在 a
可能被评估之前被评估。
这在 C standard 的第 6.5.15p4 节中有解释:
The first operand is evaluated; there is a sequence point between its evaluation and the evaluation of the second or third operand (whichever is evaluated). The second operand is evaluated only if the first compares unequal to 0; the third operand is evaluated only if the first compares equal to 0; the result is the value of the second or third operand(whichever is evaluated), converted to the type described below.