求大家帮忙一下 这道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为什么不对 展开
我也纠结这问题的答案, 他选的是A 但是我不明白D为什么不对 展开
8个回答
展开全部
在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
你自己编译一下呗
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
你自己编译一下呗
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这个结果没有一个是对的,答案应该是111。因为printf函数是对变量列表从右向左计算的,先--n使=1,再n++因是后++值不变还是1;等三个1全输出了再执行n++使n=2。出题的人只是纸上谈兵!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
A, 视乎编译器的实现, 结果可能会有多种
答案没有A? 我推测是A 是 因为函数是从在往右计算,并入栈, 函数内部弹出栈时就显得是从右往左, 实则显示是从左往右, 但是参数计算顺序是完全由编译器计算方式实现的,所以是不定的,如GCC与VC的实现可能就不同,所以实际开发过程中不要写这样的NC式语句,会给移植造成很大的问题
答案没有A? 我推测是A 是 因为函数是从在往右计算,并入栈, 函数内部弹出栈时就显得是从右往左, 实则显示是从左往右, 但是参数计算顺序是完全由编译器计算方式实现的,所以是不定的,如GCC与VC的实现可能就不同,所以实际开发过程中不要写这样的NC式语句,会给移植造成很大的问题
来自:求助得到的回答
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询