c语言中,a=2,m=(++a)+ (++a)+(++a),为什麽等于13,费解,哪位大神给解释一下。
17个回答
展开全部
初步判断是编译器的原因,因为每种编译器对++ --前至后至的处理是不一样的。你用的是dev-c++?
你试一下把式子改成a=2,m=(++a)+ (++a);得出的结果是多少?理论上是8,
因为所有的前至++都可以转换(复杂优先级的情况除外),这个表达式可以转换成
a=a+1;
a=a+1;
m=a+a;
所以等于8。但是当多增加一个(++a)的时候,理论上是
a=a+1;
a=a+1;
a=a+1;
m=a+a+a;值应该为15
但是有的编译器的处理不是这样的,他会变成,先计算前两个(++a)+(++a)按照转换的计算方法值为8,然后a再自加,最后在加上a,所以就变成8 + 5(a自加后的值) =13。
前两个(++a)+ (++a)计算出来的是8,后面的a都是逐次自加,与前两个计算的方法不同,否则m=(++a)+ (++a)+(++a)应该等于12了 (3 + 4+ 5)
为了验证,你可以计算,
a=2,m=(++a)+ (++a);值为8 (4 + 4)
a=2,m=(++a)+ (++a)+(++a)+(++a) 值应该是19 (4 + 4 + 5 + 6)
a=2,m=(++a)+ (++a)+(++a)+(++a)+(++a) 值应该是26 (4 + 4 + 5 + 6 + 7 )
a=2,m=(++a)+ (++a)+(++a)+(++a)+(++a)+(++a) 值应该是34 (4 + 4 + 5 + 6 + 7 +8)
这个完全是编译器在作怪,没有什么可担心的,其实在实际的开发中是不允许写出这种代码的。知道有这个事就行了
你试一下把式子改成a=2,m=(++a)+ (++a);得出的结果是多少?理论上是8,
因为所有的前至++都可以转换(复杂优先级的情况除外),这个表达式可以转换成
a=a+1;
a=a+1;
m=a+a;
所以等于8。但是当多增加一个(++a)的时候,理论上是
a=a+1;
a=a+1;
a=a+1;
m=a+a+a;值应该为15
但是有的编译器的处理不是这样的,他会变成,先计算前两个(++a)+(++a)按照转换的计算方法值为8,然后a再自加,最后在加上a,所以就变成8 + 5(a自加后的值) =13。
前两个(++a)+ (++a)计算出来的是8,后面的a都是逐次自加,与前两个计算的方法不同,否则m=(++a)+ (++a)+(++a)应该等于12了 (3 + 4+ 5)
为了验证,你可以计算,
a=2,m=(++a)+ (++a);值为8 (4 + 4)
a=2,m=(++a)+ (++a)+(++a)+(++a) 值应该是19 (4 + 4 + 5 + 6)
a=2,m=(++a)+ (++a)+(++a)+(++a)+(++a) 值应该是26 (4 + 4 + 5 + 6 + 7 )
a=2,m=(++a)+ (++a)+(++a)+(++a)+(++a)+(++a) 值应该是34 (4 + 4 + 5 + 6 + 7 +8)
这个完全是编译器在作怪,没有什么可担心的,其实在实际的开发中是不允许写出这种代码的。知道有这个事就行了
展开全部
我的理解是这样的啊。。。内存中某一单元存放a的值,第一次++后a=3,第二次++后a=4,此时内存单元中a的值是4,而此时程序将要执行前两项的和,而此时第一项是要取a的值,故会是4+4.而此时加的结果是存放在CPU的一个寄存器中的,后来,a有自加一次。所以结果是13.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
“+”是一个双目运算符,所以只能先算(++a)+ (++a),++优先级高,所以先算两遍++,就等于4+4,然后再算剩下的++a=5;所以m=13。记得给分哟~
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
2个原因:
1、自增运算++a是先增量后引用;
2、运算符“+”结合优先顺序使得表达式要经过2次运算;
总结起来:先是(++a)两次,此时a=4,4+4=8,然后再(++a)一次,此时a=5,最后8+5=13。
1、自增运算++a是先增量后引用;
2、运算符“+”结合优先顺序使得表达式要经过2次运算;
总结起来:先是(++a)两次,此时a=4,4+4=8,然后再(++a)一次,此时a=5,最后8+5=13。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
首先你要明白什么是表达式,还有变量。
A是一个变量。
A++,++A都是A加了1.
比如A原来是1,执行了A++或++A后,A变量的值就是2了
至于A++和++A的区别主要是在表达式上的区别。
++A是先执行了A加1后,参与表达式的计算。
A++是A先参与表达式的计算,后执行自加1.
比如:
int a,b;
a=1;//如果你想把a的值1,付给b.那么,但你又想使得a加1。你就可以这么做
b=a++;//++在a之后,先把a的值付给b,然后再本身加1 。这时候b=1,a=2了。
//如果你还不懂得话。b=a++;的意思 就是b=a;a=a+1;这两句意思
//而b=++a 就是 a=a+1;b=a;的意思
你这个题目实际是这样的: M=(3)+(4)+(5)+1=13!
A是一个变量。
A++,++A都是A加了1.
比如A原来是1,执行了A++或++A后,A变量的值就是2了
至于A++和++A的区别主要是在表达式上的区别。
++A是先执行了A加1后,参与表达式的计算。
A++是A先参与表达式的计算,后执行自加1.
比如:
int a,b;
a=1;//如果你想把a的值1,付给b.那么,但你又想使得a加1。你就可以这么做
b=a++;//++在a之后,先把a的值付给b,然后再本身加1 。这时候b=1,a=2了。
//如果你还不懂得话。b=a++;的意思 就是b=a;a=a+1;这两句意思
//而b=++a 就是 a=a+1;b=a;的意思
你这个题目实际是这样的: M=(3)+(4)+(5)+1=13!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询