在c语句中多次使用三元运算符

时间:2016-01-25 18:25:37

标签: c

我正在查看代码段并看到下面的声明。以下陈述将如何评估?

x= 5|(high == 1 ? y : high == 0 ? z:0);

3 个答案:

答案 0 :(得分:3)

表达式

x= 5|(high == 1 ? y : high == 0 ? z:0);

评估为

x= 5|( high == 1 ? y : (high == 0 ? z:0) );  

它具有与

类似的效果
if(high == 1)  
    x = 5|y;
else if(high == 0)
    x = 5|z;  
else  
    x = 5|0;

答案 1 :(得分:0)

就像

if(high == 1)
    y;
else if(high == 0)
    z;
else
    0;

答案 2 :(得分:0)

来自C99 standard,第6.5.15.4节:

  

评估第一个操作数;它之后有一个序列点   评价。仅在第一个操作数被评估时才计算第二个操作数   比较不等于0; 只有在第三个操作数被评估时才会被评估   首先比较等于0 ;结果是第二个或的值   第三个操作数(曾经被评估过),转换为该类型   如下面所描述的。如果尝试修改条件运算符的结果   或者在下一个序列点之后访问它,行为是   未定义。

因为操作数从左到右计算,所以三元运算符的第二个实例(所有三个部分)成为第一个三元运算符的第三部分中的表达式。

所以这个:

high == 1 ? y : high == 0 ? z:0

相当于:

(high == 1) ? y : ((high == 0) ? z:0)