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.