已知int a=5,b=5; 则表达式: ++a>b?a:b-->++a?++b:a的值为6。
已知inta=5,b=5;则表达式:++a>b?a:b-->++a?++b:a的值为6。(正确)我怎么算不出来,我得7,错哪?...
已知int a=5,b=5; 则表达式: ++a>b?a:b-->++a?++b:a的值为6。( 正确 ) 我怎么算不出来,我得7,错哪?
展开
5个回答
展开全部
已知int a=5,b=5; 则表达式: ++a>b?a:b-->++a?++b:a的值为6。
这个题有两个问号表达式,而且还有嵌套现象,所以它的关键,是把表达式的计算过程(先后顺序)搞清楚,是按下面
(1)(++a>b?a:b--)>(++a?++b:a)
(2)((++a>b?a:b--)>++a)?++b:a
(3)++a>b?a:(b-->++a?++b:a)
哪一个计算的问题。
第①种情况,显然把>放到了最后计算,而因为>的优先级比?:的优先级高,所以,这个顺序是错误的。
第②种情况,是在确定第一个问号表达式的【表达式3】时,没有考虑到b--后面的>号,那是优先级比问号表达式高的运算,所以,它也是错误的。
第③种情况,把a:后面的一个整体(一个完整的问号表达式),作为前一个问号表达式的【表达式3】,这才符合优先规定。
但是,实际上并没有括号,你只能理解为:
++a > b ? a: b-->++a?++b:a
写的离远一点,只是为了方便看它的结构,
实际运行时,先算前一个问号表达式:
++a > b ? ==> ++5>5? ==> 6>5? 显然是成立的,也就是,接下来,会执行【表达式2】,并把【表达式2】的值赋给x:
a: b-->++a?++b:a
这时,表达式2只有一个a,也就把a的值(6)赋给x了。
后面的 b-->++a?++b:a呢?将不会运行,这是c语言设计者的聪明之处,用不到的表达式不会去计算它的值。
所以,x的值为6。
如有不明白之处请留言追问。
这个题有两个问号表达式,而且还有嵌套现象,所以它的关键,是把表达式的计算过程(先后顺序)搞清楚,是按下面
(1)(++a>b?a:b--)>(++a?++b:a)
(2)((++a>b?a:b--)>++a)?++b:a
(3)++a>b?a:(b-->++a?++b:a)
哪一个计算的问题。
第①种情况,显然把>放到了最后计算,而因为>的优先级比?:的优先级高,所以,这个顺序是错误的。
第②种情况,是在确定第一个问号表达式的【表达式3】时,没有考虑到b--后面的>号,那是优先级比问号表达式高的运算,所以,它也是错误的。
第③种情况,把a:后面的一个整体(一个完整的问号表达式),作为前一个问号表达式的【表达式3】,这才符合优先规定。
但是,实际上并没有括号,你只能理解为:
++a > b ? a: b-->++a?++b:a
写的离远一点,只是为了方便看它的结构,
实际运行时,先算前一个问号表达式:
++a > b ? ==> ++5>5? ==> 6>5? 显然是成立的,也就是,接下来,会执行【表达式2】,并把【表达式2】的值赋给x:
a: b-->++a?++b:a
这时,表达式2只有一个a,也就把a的值(6)赋给x了。
后面的 b-->++a?++b:a呢?将不会运行,这是c语言设计者的聪明之处,用不到的表达式不会去计算它的值。
所以,x的值为6。
如有不明白之处请留言追问。
更多追问追答
追问
不是先计算b-->++a?++b:a吗,结合性从右到左,为什么有些又是先右边
不是先计算b-->++a?++b:a吗,结合性从右到左,为什么有些又是先右边
展开全部
最後值为7,这是一个if语句,就是
int a=5,b=6;
if(++a==b--) ++a;
else --b;
++ar的规则是先运算,所以括号中左值++a=6,a=6;
==的优先级低过--,所以先计算b--
b--的规则是先赋值,所以括号中右值b--=6,b=5;
左值6==右值6,即条件为真,执行++a,因为a值已是6, 所以加1操作後,
结果为 7
int a=5,b=6;
if(++a==b--) ++a;
else --b;
++ar的规则是先运算,所以括号中左值++a=6,a=6;
==的优先级低过--,所以先计算b--
b--的规则是先赋值,所以括号中右值b--=6,b=5;
左值6==右值6,即条件为真,执行++a,因为a值已是6, 所以加1操作後,
结果为 7
追问
? 别长得差不多就抄过了
? 别长得差不多就抄过了
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这是一个三元嵌套的问题,必须考虑把它转换成等价的if else语句。我不是很懂C,但原理是相同的。
等价的if else应该是这样的。
if(++a>b){
//上面++a改变了a的值
a=6
}else{
//由于条件不满足所有不会执行后面的代码
if(b-->++a){
++b
}else{
//输出a
a=6
}
}
所以最后 a=6,是因为后面压根就没有执行。
等价的if else应该是这样的。
if(++a>b){
//上面++a改变了a的值
a=6
}else{
//由于条件不满足所有不会执行后面的代码
if(b-->++a){
++b
}else{
//输出a
a=6
}
}
所以最后 a=6,是因为后面压根就没有执行。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
n的值仍然为2,没有改变!
过程:
先计算a>b,值为0,赋给m的值为0,表达式m=a>b的值也是0。
对于&&逻辑运算,不管后面(n=c>d)的值如何,都不影响(m=a>b)&&(n=c>d)的最终结果,因此,C语言不再对表达式n=c>d进行计算。因而n的值没有改变!!
过程:
先计算a>b,值为0,赋给m的值为0,表达式m=a>b的值也是0。
对于&&逻辑运算,不管后面(n=c>d)的值如何,都不影响(m=a>b)&&(n=c>d)的最终结果,因此,C语言不再对表达式n=c>d进行计算。因而n的值没有改变!!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询