求大家帮忙一下 这道C语言题目要选哪个 顺便告诉我原因 谢谢!

8.下面程序的执行结果是____________(B)main(){intn=1;n++;printf("%d%d%d",n,n++,――n);}A、221B、222C、... 8. 下面程序的执行结果是____________(B) main() { int n=1; n++; printf("%d%d%d",n,n++,――n);} A、2 2 1 B、2 2 2 C、2 3 2 D、2 1 1
我也纠结这问题的答案, 他选的是A 但是我不明白D为什么不对
展开
 我来答
松甜恬0Je4ba
2013-04-05 · TA获得超过2.6万个赞
知道大有可为答主
回答量:7475
采纳率:100%
帮助的人:3371万
展开全部
我看着选D啊

printf输出的时候,是从后面往前计算的。
一开始n=1,然后自加1变成2了

然后 --n是先减1,在使用 所以输出为1 ,n变成1了
n++是先使用,在自增1,所以输出为1 n变成2了
n直接输出2

所以是 2 1 1
天之血泪ぬd8a
2013-04-05 · 超过47用户采纳过TA的回答
知道小有建树答主
回答量:141
采纳率:0%
帮助的人:77.4万
展开全部
在C语言中,printf()是的计算从右向左的,显示是从左向右的,这道题,先算--n, n++, n;
1) n=1;n++;n=2;
2) n=2;--n;n=1; 第三个是1;
3) n=1;n++;第二个显示1,n=2
4) n=2,第一个显示2

选D
你自己编译一下呗
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
13203200199
2013-04-05 · TA获得超过220个赞
知道小有建树答主
回答量:205
采纳率:0%
帮助的人:185万
展开全部

最好的办法是在机器上执行一遍!很奇怪,我在vs2012上执行的结果是212,在vc6里执行的结果是111,所以同意楼下的观点,结果在乎于编译器的实现!出题的人的确只是纸上谈兵!

在vs2012下的运行结果!


在vc6下的运行结果!

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
目头小子
2013-04-06 · 超过25用户采纳过TA的回答
知道答主
回答量:105
采纳率:0%
帮助的人:40.8万
展开全部

2,2,2


注解

n++ = 1;

int n=1;

n++;                                        n=1,n++ =2


printf("%d%d%d",


n,                                             n=2

n++,                                      n=2,++n =3

――n                                           n=3,--n=2




分类: C/C++
#include<stdio.h>
void main()
{
int i=1;
printf("%d%d%d%d%d",i++,i--,--i,++i,i);
}
我的最初想法,参数从左到右依次计算,也就是等同于:
printf("%d",i++);
printf("%d",i--);
printf("%d",--i);
printf("%d",++i);
printf("%d%",i);
先i++,所以输出i的值1后再i=i+1,此时输出为1,i=2
再i--,同样先输出i的值2后再i=i-1,此时输出为1 2,i=1
然后--i,先计算i=i-1=0,再输出i,此时输出为1 2 0,i=0
同样的++i,先计算i=i+1=1,再输出i,此时输出为1 2 0 1,i=1
最后输出i,所以最终输出是1 2 0 1 1
但是实际的运行结果并不是我想像的这样,这估计是因为c++的printf函数采用的是cdecl方式传递参数的关系,即参数入栈顺序是从右向左,自然执行的顺序也是自右向左啦,所以正确的顺序是:
先算最后的输出1
其次++i,输出1 2,i=2
再次--i,输出1 2 1,i=1
接着i--,输出1 2 1 1,i=1
最后i++,输出1 2 1 1 1
这就和我汇编查看运行的结果一致了:
1入栈
2入栈
1入栈
1入栈
1入栈
从这里,我们又可以看出这个顺序又和printf的输出顺序一致了,我猜测printf函数就直接根据这个顺序进行输出了
另外关于前面标记的“重点”
#include<stdio.h>
void main()
{
int i=1;
printf("%d%d%d%d%d",i--,i--,--i,++i,i);
cout<<i;
}
把第一个i++改成了i--可以看到最后输出的数字是-1,所以表明在执行完printf函数后执行了2次i=i-1
这也就是为什么为什么最后输出的2个都是1了
补充:
虽然知道i++,就是运算后再加,++i是先加再运算,书上都这么说。但这样其实并没有解释清楚其中的关系。对于简单的表达式入:a = b + (++i);和a = b + (i++)我们可以很好的理解。但对于一些复杂的关系我们却会迷糊。
举例:
printf("%d %d %d %d",i++,i--,++i,--i);(printf是从右向左的入栈)
a=(i--) + (i--) + (i--);
上面两个式子可能有些就会有些会弄错。
问题的关键在于要搞清楚是在什么的前后,不是++i或者i++的运算前后,而是指整个表达式的运算前后。若i=1,则第二个表达是的值为3.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
White_MouseYBZ
2013-04-05 · TA获得超过4万个赞
知道大有可为答主
回答量:2.1万
采纳率:82%
帮助的人:6482万
展开全部
这个结果没有一个是对的,答案应该是111。因为printf函数是对变量列表从右向左计算的,先--n使=1,再n++因是后++值不变还是1;等三个1全输出了再执行n++使n=2。出题的人只是纸上谈兵!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
珺伴伴I
2013-04-05 · TA获得超过337个赞
知道小有建树答主
回答量:438
采纳率:0%
帮助的人:296万
展开全部
A, 视乎编译器的实现, 结果可能会有多种

答案没有A? 我推测是A 是 因为函数是从在往右计算,并入栈, 函数内部弹出栈时就显得是从右往左, 实则显示是从左往右, 但是参数计算顺序是完全由编译器计算方式实现的,所以是不定的,如GCC与VC的实现可能就不同,所以实际开发过程中不要写这样的NC式语句,会给移植造成很大的问题
来自:求助得到的回答
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(6)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式