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

3

我知道根据标准,应避免使用fun(++a, a),因为第二个参数未定义。

但是,这种形式是否安全:

(++a ? a : 10);

我测试了这段代码,结果符合预期。即对于a = -1,它的值为10,对于任何其他的a,它的值为a+1。这个行为是否符合标准,还是强烈依赖于编译器?

1
阅读n1570 - Basile Starynkevitch
根据这个,可以安全地假设第二个和第三个参数在第一个参数之后被评估。尽管如此,我仍然希望得到更有经验的人的确认。 - Marko Gulin
你的代码在代码审查中不安全 - 我仍然会解雇你 :) - Martin James
2
@MartinJames 你一开始就请不起我 ;) - Marko Gulin
@Marko 哈哈,待会儿在就业中心见 :) - Martin James
1个回答

4

这是一个明确定义的概念。

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

这在C标准的6.5.15p4节中有解释:

评估第一个操作数; 在其评估和评估第二个或第三个操作数(哪个被评估)之间存在一个序列点。仅当第一个操作数与0不相等时,才评估第二个操作数;仅当第一个操作数等于0时,才评估第三个操作数;结果是第二个或第三个操作数(哪个被评估)的值,转换为下面描述的类型。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接