条件表达式,傻傻分不清楚
Posted binaryant
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了条件表达式,傻傻分不清楚相关的知识,希望对你有一定的参考价值。
问题:如何证明 条件表达式 的结合性。
运算符的优先级决定运算符优先选择操作数,结合性的存在是为了在相同等级的运算符谁先选择操作数;
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
所以结论是,这个测试 不管左到右还是右到左。结果值一致
以上是关于条件表达式,傻傻分不清楚的主要内容,如果未能解决你的问题,请参考以下文章
script标签的asyncdefer属性傻傻分不清楚?来一次说清楚