C 中三元运算符的求值顺序

Mar*_*lin 3 c standards conditional-operator

我知道根据标准,fun(++a, a)应该避免,因为第二个参数没有明确定义。

然而,这种配方安全吗:

(++a ? a : 10);
Run Code Online (Sandbox Code Playgroud)

我测试了这个代码片段,它按预期工作,a = -1它的计算结果为,而对于10任何其他代码段,a它的计算结果为a+1。这是标准中明确定义的,还是很大程度上取决于编译器?

dbu*_*ush 5

这是明确定义的。

在三元表达式中,首先计算第一部分。然后根据该值评估第二部分或第三部分。因此保证在可能评估++a之前进行评估。a

C 标准第 6.5.15p4 节对此进行了解释:

第一个操作数被求值; 在其求值和第二个或第三个操作数(以求值者为准)的求值之间有一个序列点。仅当第一个操作数与 0 比较时不等于 0 时,才会计算第二个操作数;仅当第一个操作数等于 0 时才计算第三个操作数;结果是第二个或第三个操作数(以计算结果为准)的值,转换为下面描述的类型。