如何理解“条件运算符”的"自右至左“的结合性

imfang 2015-03-07 08:55:19
结合性说的是当运算符的优先级相同时计算的顺序。其他的都好理解,唯有”条件运算符“不好理解。

对于 t?a:b,将a或b分别改为另一个条件表达式,比如:

a>b?c>d?e:f:g

a>b?c:d>e?f:g




分析它的执行过程时,如何理解”自右至左“的结合性?当然,实际执行一个可以看出执行的过程,这里只是说如何理解结合性?

#include<stdio.h>
void main()
{
int a=10,b=20,c=30,d=40,e=50,f=60,g=70,h=80;
h=++a<++b?++c<++d?++e:++f:++g;
printf("a=%d, b=%d, c=%d, d=%d, e=%d, f=%d, g=%d, h=%d\n",a,b,c,d,e,f,g,h);
}

a=11, b=21, c=31, d=41, e=51, f=60, g=70, h=51
请按任意键继续. . .
...全文
1801 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
lin5161678 2015-03-10
  • 打赏
  • 举报
回复 1
优先级和结合性 决定 运算符和哪些操作数结合 和求值顺序 毫无关系 举一个例子 a+b+c*d 完全可以 a求值 b求值 a+b求值 然后 c求值 d求值 c*d求值 最后 a+b + c*d 求值 完毕 这里加法完全可以比乘法先求值 而*优先级高 只决定了 a+b+c*d 表达的是 a+b+ (c*d) 而不是 (a+b+c)*d a>b?c:d>e?f:g 这里根据结合性 只确定了 这个表达式是 a>b ? c : (d>e?f:g) 而不是 (a>b ? c : d>e) ? f :g 这才是 结合性的作用 和求值顺序无关
赵4老师 2015-03-10
  • 打赏
  • 举报
回复
拿人脑当编译器。
imfang 2015-03-10
  • 打赏
  • 举报
回复
引用 12 楼 lin5161678 的回复:
优先级和结合性 决定 运算符和哪些操作数结合 和求值顺序 毫无关系
我比较赞同,谢谢大家的讨论!!!
一根烂笔头 2015-03-09
  • 打赏
  • 举报
回复
拿数学中的结合律来理解也可以,结合嘛——在一起也,右呢——方向噻!假设A + B + C,你赋予+一个新的概念,就像布尔当初给+赋予与的运算类似,你重新对符号+定义一种新的运算概念使得它是右结合性,那么你就不能用A + B得出E在 E+C得出最终结果。 而是反过来先算B+C,最后再+A,因此等价于A + (B + C),那么这里的+是个抽象概念,若把+替换成实际的条件运算,您是否理解了呢?
均陵鼠侠 2015-03-09
  • 打赏
  • 举报
回复 1
条件运算符?:是右结合的。因此,表达式
a ? b : c ? d : e
a ? b ? c : d : e
分别等同于
a ? b : (c ? d : e)
a ? (b ? c : d) : e
要理解这样做的原理,只需要掌握两个原则: 1,从右边开始往左找,直至遇到第一个未被处理的“?”; 2,再从这个“?”开始往右找第一个遇到的“:”; 3,在“?”左边的操作数前加一个“(”,在“:”右边的操作数后加一个“)”; 4,返回1,继续处理其它条件运算符?:。
odisey 2015-03-09
  • 打赏
  • 举报
回复
1、表达式a>b?c>d?e:f:g只能等价于a>b?(c>d?e:f):g,这属于运算符的嵌套,实际上是一个内层的条件运算符嵌套在一个外层的条件运算符中,这里根本不需要利用结合性来解释。 2、表达式a>b?c:d>e?f:g中出现了两个条件运算符,因为它们的结合性都是从右往左,意味着应该先算右边的条件运算, 因此 a>b?c:d>e?f:g 等价于 a>b?c:(d>e?f:g) 不等价于(a>b?c:d)>e?f:g
均陵鼠侠 2015-03-08
  • 打赏
  • 举报
回复
引用 3 楼 paschen 的回复:
不要纠结这种问题,如果你觉得看不出来,就加上括号 参看:http://bbs.csdn.net/topics/370153775
引用 4 楼 max_min_ 的回复:
语法,建议加括号吧
引用 5 楼 zxh707wk 的回复:
考试才有的东西,代码是写给人看的,不是给机器看的
不明白就说不明白,不要找这个那个理由。捂着耳朵,蒙上眼睛,问题就不存在了??
jiht594 2015-03-08
  • 打赏
  • 举报
回复
引用 6 楼 sholber 的回复:
[quote=引用 3 楼 paschen 的回复:] 不要纠结这种问题,如果你觉得看不出来,就加上括号 参看:http://bbs.csdn.net/topics/370153775
引用 4 楼 max_min_ 的回复:
语法,建议加括号吧
引用 5 楼 zxh707wk 的回复:
考试才有的东西,代码是写给人看的,不是给机器看的
不明白就说不明白,不要找这个那个理由。捂着耳朵,蒙上眼睛,问题就不存在了??[/quote] 我的队友写这种代码, 我会在心里问好他家人的. 当然每个人看法不一样. 我只是说一下我的
paschen 2015-03-07
  • 打赏
  • 举报
回复
不要纠结这种问题,如果你觉得看不出来,就加上括号 参看:http://bbs.csdn.net/topics/370153775
均陵鼠侠 2015-03-07
  • 打赏
  • 举报
回复
So,
++ a < ++ b ? ++ c < ++ d ? ++ e : ++ f : ++ g;
equ.:
++ a < ++ b ? (++ c < ++ d ? ++ e : ++ f) : ++ g;
均陵鼠侠 2015-03-07
  • 打赏
  • 举报
回复
瞧瞧人家问的问题,这才叫问题呢! 给定声明:
int a = 0, b = 1, c = 2, x = 3, y = 4, z = 5;
则,
a ? b : x ? y : z
等同于
a ? b : (x ? y : z)
这是因为,要先找到最右边的?,让它与旁边的操作数结合,而它后面最近的冒号也属于它的同类。
a ? x ? y : z : b
等同于
a ? (x ? y : z) : b
原因同上。
707wk 2015-03-07
  • 打赏
  • 举报
回复
考试才有的东西,代码是写给人看的,不是给机器看的
max_min_ 2015-03-07
  • 打赏
  • 举报
回复
语法,建议加括号吧

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧