设a=1,b=2,c=3,d=4 则表达式: a<=b?a:c<=d?a:d 结果是1 请问这结果是怎么来的呢?
设a=1,b=2,c=3,d=4 则表达式: a<=b?a:c<=d?a:d 结果是1 请问这结果是怎么来的呢? 问题点数:100、回复次数:22Top
1 楼WingForce(初六,履霜,坚冰至。)回复于 2005-08-02 23:34:38 得分 0
int fn(int a, int b, int c, int d)
if(a <= b)
{
return a;
}
else
{
if(c <= d)
{
return a;
}
else
{
return d;
}
}Top
2 楼foochow(无聊,灌水......)回复于 2005-08-02 23:35:50 得分 0
a<=b?a:c<=d?a:d --->a<=b?a:(c<=d?a:d)
Top
3 楼boxban(冻酸梨)回复于 2005-08-02 23:36:10 得分 0
这个~~~~~~~~~~
无语Top
4 楼qybao(阿宝)回复于 2005-08-02 23:36:42 得分 0
a<=b?a:c<=d?a:d
首先判断条件a<=b,如果成立则取a的值,不成立则取(c<=d?a:d)的值
对于c<=d?a:d,先判断c<=d,如果成立则取a的值,不成立则取d的值
所以,很明显,你的表达式里一开始a<=b条件就成立了,直接就取a的值了,a的值就是1,所以结果是1
Top
5 楼apollon_hhy(一天五十页!)回复于 2005-08-03 02:17:51 得分 0
我觉得 楼主首先 应该清楚 ? : 三目运算符的用法
a ? b : c 如果 a 是 true 则 b ,否则 a 为false 则 c
a<=b?a:c<=d?a:d 相当于 a<=b ? a : (c<=d ? a : d)
a=1,b=2,c=3,d=4 显然 a<=b 为true ;Top
6 楼jixingzhong(瞌睡虫·星辰)回复于 2005-08-03 07:41:09 得分 0
我想楼主是不是写错了 ?
可能原来的题目是
a<=b?a:c<=d?c:d 而不是 a<=b?a:c<=d?a:d 吧
(不过结果一样)
这里的问题,
关键的是 三目运算符 的结合方向 ,
除了 单目运算符 以外
还有 这个 三目运算符 是 右结合 的
所谓 右结合 ,是说有多重该运算符号的时候
系统会优先满足式子右边的
比如楼主的问题 a<=b?a:c<=d?a:d ==>a<=b?a:(c<=d?a:d)
类似的 单目运算符号 也一样
比如 +++i ==> +(++i)
楼主要多加注意
这些很容易让人迷糊的Top
7 楼afx_swallow(足球和啤酒)回复于 2005-08-03 07:43:01 得分 0
转新手乐园Top
8 楼copygirl(wa!)回复于 2005-08-03 08:26:12 得分 0
设a=1,b=2,c=3,d=4
a<=b?a:(c<=d?a:d)
因为a<=b,所以等式取a的值1Top
9 楼jsjjms(专心研究嵌入式)回复于 2005-08-03 08:40:26 得分 0
设a=1,b=2,c=3,d=4 则表达式: a<=b?a:c<=d?a:d 结果是1 请问这结果是怎么来的呢?
------------------------------------------------------------------------------
a<=b?a:c --> if (a<=b) then tmp=a; else tmp =c;
这种嵌套写法 加上括号就清楚多了.没有括号
就要清楚运算符的优先级Top
10 楼jighrfgdd()回复于 2005-08-03 09:38:08 得分 0
回复人: qybao(阿宝) ( ) 信誉:100 2005-8-2 23:36:43 得分: 0
a<=b?a:c<=d?a:d
首先判断条件a<=b,如果成立则取a的值,不成立则取(c<=d?a:d)的值
对于c<=d?a:d,先判断c<=d,如果成立则取a的值,不成立则取d的值
所以,很明显,你的表达式里一开始a<=b条件就成立了,直接就取a的值了,a的值就是1,所以结果是1
********************************************
上面是从左边开始算的
回复人: jixingzhong(瞌睡虫) ( ) 信誉:100 2005-8-3 7:41:09 得分: 0
我想楼主是不是写错了 ?
可能原来的题目是
a<=b?a:c<=d?c:d 而不是 a<=b?a:c<=d?a:d 吧
(不过结果一样)
这里的问题,
关键的是 三目运算符 的结合方向 ,
除了 单目运算符 以外
还有 这个 三目运算符 是 右结合 的
所谓 右结合 ,是说有多重该运算符号的时候
系统会优先满足式子右边的
比如楼主的问题 a<=b?a:c<=d?a:d ==>a<=b?a:(c<=d?a:d)
类似的 单目运算符号 也一样
比如 +++i ==> +(++i)
楼主要多加注意
这些很容易让人迷糊的
**********************************
这位讲是右边开始算的
到底哪个对呢?我学的是它有右结合性的
Top
11 楼xuanwenchao(xuanwenchao)回复于 2005-08-03 09:41:52 得分 0
设a=1,b=2,c=3,d=4 则表达式: a<=b?a:c<=d?a:d 结果是1 请问这结果是怎么来的呢?
a<=b ? a : (c<=d?a:d)
a<=b成立则返回a的值不成立则返回(c<=d?a:d)的值,所以得1
Top
12 楼qybao(阿宝)回复于 2005-08-03 11:37:10 得分 0
a<=b?a:c<=d?a:d
首先判断条件a<=b,如果成立则取a的值,不成立则取(c<=d?a:d)的值
对于c<=d?a:d,先判断c<=d,如果成立则取a的值,不成立则取d的值
所以,很明显,你的表达式里一开始a<=b条件就成立了,直接就取a的值了,a的值就是1,所以结果是1
********************************************
上面是从左边开始算的
从右算也是一样的结果,毕竟从右算最后也要走到a<=b这一步判断,结果很明显了
一般所谓的从左,从右算,要看编译器的,不同的编译器运算方式也不一样,但不管怎样,只要知道运算的逻辑原理就可以了
Top
13 楼qybao(阿宝)回复于 2005-08-03 11:43:55 得分 0
可以用以下的方法测试编译器是从左算还是从右算
k=0;
a<=b?a:(k=c<=d?a:d)
printf("k=%d",k);
如果k值不是0,就说明是从右算的,否则就是从左算的
Top
14 楼jighrfgdd()回复于 2005-08-03 13:13:48 得分 0
tc是从从左算还是从右算?Top
15 楼gogdo(草草)回复于 2005-08-04 00:43:00 得分 0
问题的解决方法是你按运算符的优先级的顺序加上括号,问题就变得很清楚了。
Top
16 楼zsd1101897(好死不如赖活~)回复于 2005-08-06 21:41:33 得分 0
设a=1,b=2,c=3,d=4 则表达式: a<=b?a:c<=d?a:d 结果是1 请问这结果是怎么来的呢?
看这道题 只要分析两个嘛 很简单
1运算符的优先级
2运算符的结合方向
这道题只涉及2个运算符号
1 ?: 条件运算符 结合方向 从右至左
2 <= 关系运算符 结合方向 从左至右
3关系运算符的优先级大于条件运算符
所以在解这道题的时候按这个顺序看可能容易理解点
1 先解答a<=b 得到答案为1
此时这条式可以简化为 1?a:c<=d?a:d
2解答c<=d 得到答案为1
此时这条式可以简化为 1?a:1?a:b
3由于条件运算符的结合方向是从右到左
所以先算后面的那个1?a:b部分 得到答案为1(就是a)
此时这条式可以简化为 1?a:1
4呵呵 ,这个当然也就是a啦~也就是1了
思考问题应该有点条理性!~建议楼主以后在问问题前应该仔细思考Top
17 楼llf_hust()回复于 2005-08-06 21:43:45 得分 0
认真看书,把基础打好Top
18 楼bombwang(王)回复于 2005-08-06 21:44:35 得分 0
(a<=b)?a:(c<=d?a:d)
自己慢慢算Top
19 楼K()回复于 2005-08-06 22:28:26 得分 0
看看基础吧Top
20 楼lxk_cool()回复于 2005-08-06 22:37:58 得分 0
关于?:的用法,看看书吧Top
21 楼tygfr(Try to do!)回复于 2005-08-06 23:14:00 得分 0
先把逻辑运算和算术运算这两个基本的概念搞清楚再说Top
22 楼prgmBaggio(only C)回复于 2005-08-06 23:27:27 得分 0
(a<=b)?(a):(c<=d?a:d)Top




