2016-01-25 42 views

回答

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; 
+0

你会写一行或'if/else if/else'版本吗? – bolov

+0

@bolov;如果我必须编写内联函数或宏,那么我将使用'?:'版本,否则使用'if/else if/else'。 – haccks

0

及其类似的效果喜欢

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

C99 standard,节6.5.15.4:

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

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

所以这个:

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

是相同的:

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