黑马程序员技术交流社区

标题: 关于三目运算符的题目 求解 [打印本页]

作者: 刘圣涛    时间: 2014-7-10 00:05
标题: 关于三目运算符的题目 求解
本帖最后由 刘圣涛 于 2014-7-11 11:23 编辑

我复习没多久,之前对C语言的知识了解的少点,今天看到关于三目运算符的题目,就是想不明白了,求大神解答。
题目如下:
假设 a=1,b=2,c=3,d=4;
        a<b?a:c<d?a:d;
         输出的结果是多少啊???求解,一直没搞懂
作者: chengnuoaini030    时间: 2014-7-10 00:10
结果应该是1吧,首先是判断 a是否小于b ,如果小于输出a,如果不小于判断c是否小于d,如果小于输出a,不小于则输出d,    那么 a=1,b=2 ,  第一次判定  a<b?   也就是  1<2?    那应该为真,返回后面的a,   也就是1.  我是这么理解的
作者: Moebius    时间: 2014-7-10 00:18
a<b?a:b 问号左边的如果为真,就返回a,为假就返回b。
在看看你上面的那个式子,a<b?a:c<d?a:d;  意思就是如果a<b为真,就返回a,为假就返回c<d?a:d,而这一题a=1;b=2   所以最终值为a

作者: fantacyleo    时间: 2014-7-10 01:43
这个毫无迷惑性,怎么求都是一个答案:1  应该来试试这个
  1. int x = 3, y = 2;
  2. x > y ? 10 : ++y > 2 ? 20 : 30
复制代码

作者: 零下_1°    时间: 2014-7-10 01:47
本帖最后由 零下_1° 于 2014-7-10 01:48 编辑

从左到右开始算   ((a<b?a:c)<d)?a:d;——>((1)<4)?1:4——>1
作者: ckathlon_fx    时间: 2014-7-10 01:54
上面已经有解了, 主要是看运算从左到右顺序和运算符号的运算优先顺序。把他们理解后,答案自然就清晰了。
作者: fantacyleo    时间: 2014-7-10 02:14
零下_1° 发表于 2014-7-10 01:47
从左到右开始算   ((a

这个肯定不对。<的优先级高于?:,c不可能去和?:结合,却不与<d结合
作者: PowerLion    时间: 2014-7-10 04:39
a小于b 所以返回:左边的a  返回值为1 后面不用看了
作者: 幕夏    时间: 2014-7-10 10:09
本帖最后由 幕夏 于 2014-7-10 10:11 编辑

是这样理解的把a<b?a:   (  c<d?a:d);
作者: 零下_1°    时间: 2014-7-10 13:39
fantacyleo 发表于 2014-7-10 02:14
这个肯定不对。

用vc6.0验证了一下,结果是1,那个三目运算符是一个整体,应该不能拆开理解吧。如果c先与<d结合,那怎么出结果呢?(a<b)?a:(c<d)?a:d;——>((1<2)?1:(3<4))?1:4——>1?1:4
这个课怎么出结果啊?
作者: fantacyleo    时间: 2014-7-10 13:53
零下_1° 发表于 2014-7-10 13:39
用vc6.0验证了一下,结果是1,那个三目运算符是一个整体,应该不能拆开理解吧。如果c先与 ...

三目运算符的优先级比<低,你的做法违背了优先级。看我写的说明:http://bbs.itheima.com/thread-128465-1-1.html
作者: 愿望    时间: 2014-7-10 16:22
条件?数值1:数值2     条件成立,返回到数值1,  条件不成立 ,返回到数值2  ;就是这样 ,  这里a<b不成立,返回到c, 就是3       ,         3又小于d,成立吧, 就返回到a,
作者: zhs    时间: 2014-7-10 17:35
输出结果为1
第一步:判断优先级,关系运算a<b和c<d的优先级高于条件运算?:的优先级,所以第一步后运算结果为1?a:1?a:d
第二步:经过第一步计算后1?a:1?a:d只有条件运算?:,优先级相同自左向右运算,可以看作1?a:{1?a:d},把大括号内部分看作一个整体运算前面的条件运算,即1?a:整体。
第三步:因为1为真,所以直接输出a的值即1,不考虑整体这一块即可,如果为假才会计算整体这一块。
作者: 且行且惜    时间: 2014-7-10 17:55
输出结果应该是1,双目就是一个if语句而已,if(a<b)返回a else if(c<d) 返回a  else 返回d;,用if更容易理解,希望对你有所帮助
作者: DYKJ12    时间: 2014-7-10 18:07
来学习学习
作者: 为梦想挺身而出    时间: 2014-7-10 18:18
很详细 又学到东西了
作者: 一生有你qms    时间: 2014-7-10 18:31
我咋记得是从右左运算呢?
作者: 这个夏天的芬芳    时间: 2014-7-10 19:33
{:2_31:}{:2_31:}{:2_31:}{:2_31:}{:2_31:}{:2_31:}
作者: 刘圣涛    时间: 2014-7-10 21:20
谢谢大家的解答,我差不多明白了
作者: Bugist    时间: 2014-7-10 21:35
没错,就是1
作者: 丶白菜你个小番    时间: 2014-7-10 21:50
a<b?a:(c<d?a:d)
作者: 丶白菜你个小番    时间: 2014-7-10 21:57
返回值为1,a<b?就可以看出值为a;如果想了解全部,其实只要高清优先级就行了,可以查看表然后括起来。就容易解答了
作者: 骑着飞机去看海    时间: 2014-7-10 23:17
本帖最后由 骑着飞机去看海 于 2014-7-11 00:11 编辑
zhs 发表于 2014-7-10 17:35


额这题有点蒙,不过仔细看看还是会懂的,


作者: 骑着飞机去看海    时间: 2014-7-10 23:29
本帖最后由 骑着飞机去看海 于 2014-7-11 00:12 编辑

这么霸气,这么多人回复。我也来看看,这个要先做优先级最高的,在做,低得~~

作者: 骑着飞机去看海    时间: 2014-7-10 23:31
零下_1° 发表于 2014-7-10 13:39
用vc6.0验证了一下,结果是1,那个三目运算符是一个整体,应该不能拆开理解吧。如果c先与 ...

都拆开,一步一步来,就懂了。
作者: 大坏蛋    时间: 2014-7-10 23:39
是1吧,拆开看嘛,一个一个的分析就不会乱了  从左到右
作者: fantacyleo    时间: 2014-7-11 00:12
骑着飞机去看海 发表于 2014-7-10 23:29
这么霸气,这么多人回复。我也来看看,其实如何验证以上回复那个是对的呢?这个简单嘛,直接从新赋值就行了 ...

不从运算符的优先级和结合性入手的,都是蒙。<的优先级高于三目运算符,而三目运算符又是右结合的,a < b ? a : c < d ? a:d 的结合顺序是
(a < b) ? a : ((c < d) ? a : d)。 按你的说法,从左到右结合,那就变成:((a < b) ? a : c)) < d ? a : d 那么下面这个例子的结果应该是2,实际上是3
  1. int a = 3, b = 4, c = 6, d = 2;
  2. printf("%d\n",a < b ? a : c < d ? a:d );
复制代码

作者: 骑着飞机去看海    时间: 2014-7-11 00:13
大坏蛋 发表于 2014-7-10 23:39
是1吧,拆开看嘛,一个一个的分析就不会乱了  从左到右

先按照优先级来算。。。。。在 从右到左解题,
作者: 骑着飞机去看海    时间: 2014-7-11 00:20
fantacyleo 发表于 2014-7-10 01:43
这个毫无迷惑性,怎么求都是一个答案:1  应该来试试这个

有意思,你要是在加个括号更有意思了,哈哈。先算优先级最高的,成立后为1,然后再算优先级低的,从右往左算,就出来了。3>2,++y>2这两条都成立,所有方程就变成 1  ?  10: 1  ? 20:30 这样在从右到左算,1这个数判断,永远都是取第一个数。
作者: 骑着飞机去看海    时间: 2014-7-11 00:22
fantacyleo 发表于 2014-7-11 00:12
不从运算符的优先级和结合性入手的,都是蒙。

恩 我刚才有看了一下帮助文档,确实得从优先级算,才可以,优先级相等后在从右往左算起。
作者: fantacyleo    时间: 2014-7-11 00:26
骑着飞机去看海 发表于 2014-7-11 00:22
恩 我刚才有看了一下帮助文档,确实得从优先级算,才可以,优先级相等后在从右往左算起。 ...

也不对,如果从右往左算,那么我给出的++y那条就会得出不正确的答案。实际上,优先级和结合性只决定如何加括号,而与求值顺序无关。可以看这个帖子:http://bbs.itheima.com/forum.php ... mp;page=1#pid843906
作者: hm123tinghai    时间: 2014-7-11 00:33
答案怎么算都是1,可一人一个思路真是五花八门,求个正解!
作者: lipeiaiwo    时间: 2014-7-11 01:31
fantacyleo 发表于 2014-7-10 01:43
这个毫无迷惑性,怎么求都是一个答案:1  应该来试试这个

答案是20吗?:(
作者: YKS    时间: 2014-7-11 01:57
分开来算, a<b?a:c-->取a,再拿a和d比较:a<d?a:d-->取a的值
作者: fantacyleo    时间: 2014-7-11 02:12
lipeiaiwo 发表于 2014-7-11 01:31
答案是20吗?

10 想不通的来这里看http://bbs.itheima.com/thread-128465-1-1.html
作者: zhs    时间: 2014-7-11 08:40
骑着飞机去看海 发表于 2014-7-10 23:17
额这题有点蒙,不过仔细看看还是会懂的,

是的、一点点来就好了
作者: 大坏蛋    时间: 2014-7-11 09:59
骑着飞机去看海 发表于 2014-7-11 00:13
先按照优先级来算。。。。。在 从右到左解题,

我还是回家看书吧,又想当然了

作者: 大坏蛋    时间: 2014-7-11 10:37
fantacyleo 发表于 2014-7-10 01:43
这个毫无迷惑性,怎么求都是一个答案:1  应该来试试这个

大神你说得对,那个例题算错了也是1。
这个应该是10。兄弟们来看看这个题吧
作者: 大坏蛋    时间: 2014-7-11 10:38
PowerLion 发表于 2014-7-10 04:39
a小于b 所以返回:左边的a  返回值为1 后面不用看了

没错,不过你解释的不详细啊。哈哈
作者: 大坏蛋    时间: 2014-7-11 10:41
骑着飞机去看海 发表于 2014-7-11 00:22
恩 我刚才有看了一下帮助文档,确实得从优先级算,才可以,优先级相等后在从右往左算起。 ...

不对,三目运算符的求值顺序是有规定的
作者: 楠瓜果    时间: 2014-7-11 14:03
其实就是从左到右依次判断,先判断a<b吗,如果小于,就把a传出去,后面就不再运行,如果大于就判断第二个条件表达式c<d吗,如果小于,传a否则传d
作者: 54lier    时间: 2014-7-11 14:55
(a<b) ? a : (c < d ? a : d)
首先是看a是否小余b,如果a小于b,那么结果为 a.
如果a大余b,结果为(c < d ? a: d),
这里的a=1,b=2,c=3,d=4.
1<2成立,所以整个表达式结果为 1



作者: Devchen    时间: 2014-7-11 16:59
看下这组输出就会明白了,a>b?b:c<d?d:a 输出 d=4;
a>b?b:c>d?d:c 输出 3;
a<b?b:c<d?d:a 输出 b=2;
a>b?b:0?d:a 输出 1。
充分说明:
1.运算符优先级。
2.同级,从左至右执行。

作者: 刘圣涛    时间: 2014-7-12 22:20
我怎么没有技术分啊:o
作者: 云霄之上    时间: 2014-7-12 23:18
要搞懂这道题 你应该查看的是符号的优先级  然后再看这道题
作者: nishi5151    时间: 2016-4-22 00:12
求解!!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2