我正在查看代码段并看到下面的声明。以下陈述将如何评估?
x= 5|(high == 1 ? y : high == 0 ? z:0);
答案 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)