执行以下程序段后的输出结果是( )。
int x = 3;
int m, n;
n = (++x) + (++x);
m = (x--) + (x--);
printf("%d %d\n", m, n);
A、10 6
B、9 9
C、10 10
D、10 8
答案是选C,我怎么算都是7,9,求高人指导啊
他这个是X变量的存储问题。先看
n = (++x)+(++x);
从右至左,先算++x,x=4,这里x在寄存器里的值是4,再算++x,x=5。
注意,关键点来了,那这时候,n是等于4+5吗,不是的。
在进行加法时,A+B,寄存器会在得到A,B的值以后才会开始加法计算,现在,A,B的地址都指向X,当最后x=5时,实际上把A的值也做了改变,变成了5,千万不要想当然认为有一个临时变量来保存开始x=4的值,没有的。所以结果自然是x+x = 10
同理到x--
n = (++x)+(++x);
从右至左,先算++x,x=4,这里x在寄存器里的值是4,再算++x,x=5。
注意,关键点来了,那这时候,n是等于4+5吗,不是的。
在进行加法时,A+B,寄存器会在得到A,B的值以后才会开始加法计算,现在,A,B的地址都指向X,当最后x=5时,实际上把A的值也做了改变,变成了5,千万不要想当然认为有一个临时变量来保存开始x=4的值,没有的。所以结果自然是x+x = 10
同理到x--
温馨提示:答案为网友推荐,仅供参考
第1个回答 2015-10-31
1、C语言中,后置自增(自减)是在执行完所在语句后,变量的值再自增(自减)。
2、举例说明如下:
int num=0, s=0;
while(num++<3)
{
s = s + num;
}
// 第1次执行while时,num=0,第1次执行完while后,num=1,此时,s=0+1=1
// 第2次执行while时,num=1,第2次执行完while后,num=2,此时,s=1+2=3
// 第3次执行while时,num=2,第3次执行完while后,num=3,此时,s=3+3=6
// 第4次执行while时,由于num=4>3,所以推出循环,最后s=6
2、举例说明如下:
int num=0, s=0;
while(num++<3)
{
s = s + num;
}
// 第1次执行while时,num=0,第1次执行完while后,num=1,此时,s=0+1=1
// 第2次执行while时,num=1,第2次执行完while后,num=2,此时,s=1+2=3
// 第3次执行while时,num=2,第3次执行完while后,num=3,此时,s=3+3=6
// 第4次执行while时,由于num=4>3,所以推出循环,最后s=6
第2个回答 2011-10-13
你要知道“++”,“--”在变量前后的区别。
在前,比如“++x",是先将自增,再赋值,那么n = (++x)+(++x)就是4+5 = 9
然后,“x--"就是先赋值再自减,那么刚刚经过n = (++x)+(++x)后,x=5,带入m=(x--)+(x--)还是等于9。
我觉得答案错了,不要迷信答案,你自己到VC或者Turbo C上跑一下不就解决了。追问
在前,比如“++x",是先将自增,再赋值,那么n = (++x)+(++x)就是4+5 = 9
然后,“x--"就是先赋值再自减,那么刚刚经过n = (++x)+(++x)后,x=5,带入m=(x--)+(x--)还是等于9。
我觉得答案错了,不要迷信答案,你自己到VC或者Turbo C上跑一下不就解决了。追问
这是道竞赛题,编译环境是在TC1.9,我跑过了,答案就是10,10的,郁闷了啊
追答我在MS C下跑了,也是10,10,我知道原因了。
我的教材上有一章就是讲这个原理的,和编译器有关:
m = (++i)+(++i);先将i自增两次,然后才计算表达式(5+5);
n = (i--)+(i--);用i的原值先运算(5+5),再自减两次;
不信,你把我的代码去跑一次
int x = 3;
int m(0),n(0);
m = (++x)+(++x);
printf("x = %d\n",x);
n = (x--)+(x--);
printf("x = %d\n",x);
printf("m=%d,n=%d\n",m,n);
应该是
x = 5;
x = 3;
m = 10,n = 10
第3个回答 2011-10-13
因为++x是先把x自加1,然后再运算。第一次++x,x=4,第二次++x,x=5;然后n=x+x,n=5+5;
因为x--是先运算再自减1,所以m=5+5;m=10
因为x--是先运算再自减1,所以m=5+5;m=10