条件表达式,傻傻分不清楚

问题:如何证明 条件表达式 的结合性。

运算符的优先级决定运算符优先选择操作数,结合性的存在是为了在相同等级的运算符谁先选择操作数;

a=b=c; 同等级运算符,到底是 ((a=b )b=c)  还是  (a=(b=c)),答案是后则,原因是 =运算符是 右到左结合性

好了,分析下面的表达式

0 ? puts("A") : 0 ? puts("B") : puts("C");

  

  笔试题打印谁?

不知道结合性?

右到左,下面我们开始试着理解该表达式

(  0 ? puts("A") : ( 0 ? puts("B") : puts("C") ) );

右到左结合,那么因为右侧这个 条件表达式是 0 所以计算函数表达式puts('B')的返回值,这里有一个副作用打印字符'B',  然后到了这一步:0 ? puts("A") : 0 ,没有副作用(副作用指打印字符)
重点就是打印了 字符'B'
如果你觉得我上面分析的头头是道,那么你就需要在学一次C语言了,
答案是‘C’
 


也就是编译器这样去解析表达式了
0 ? puts("A") : (0 ? puts("B") : puts("C")); 

左到右结合, 因为左侧的 条件表达式是 0  所以把右侧是整体看成一个子表达式。 
书上,网络。都说条件表达式是 右到左结合。不知道为什么,懵逼中(难道编译器那么不遵守标准的吗?)
 

 

再次分析一个百度的例子

   int a = 1,b = 2,c = 3,d = 4;
  a < b ? a : c < d ? c : d;

 因为<运算符优先级大于 条件表达式所以,该表达式可以简化

   int a = 1,b = 2,c = 3,d = 4;
   1 ? a : 1 ? c : d;

  分析 左右结合的结果。

  右到左  (1 ? 1 : (1 ? 3 : 4 ) );   返回1

  左到右   1 ? 1 : (1 ? 3 : 4)  ;    返回1     编译器测试  1 ? 1 : 1 ? 3 : 4  值是1

  扩展测试

  左到右   0 ? 1 : (1 ? 3 : 4)  ;     返回3    编译器测试 0 ? 1 : 1 ? 3 : 4  值是3

  左到右   0 ? 1 : (0 ? 3 : 4)  ;     返回4    编译器测试 0 ? 1 : 0 ? 3 : 4  值是4

  所以结论是,这个测试 不管左到右还是右到左。结果值一致

  

  

 


猜你喜欢

转载自www.cnblogs.com/binaryAnt/p/11108494.html