C语言问题,谁能帮我解释一下这是为什么?

#include"stdio.h"main(){intn=2;printf("%d,%d,%d",++n,n+=2,--n);}这代码的输出结果按照我的理解是输出3,4,... #include "stdio.h"
main(){
int n=2;
printf("%d,%d,%d",++n,n+=2,--n);
}
这代码的输出结果按照我的理解是输出 3,4,3
可是为什么执行之后输出结果为 4,4,4
这是为什么?
展开
 我来答
shine1991
科技发烧友

2015-06-14 · 智能家居/数码/手机/智能家电产品都懂点
知道顶级答主
回答量:4.7万
采纳率:82%
帮助的人:2.3亿
展开全部
依旧是求值顺序问题,不同平台结果不同,语法标准没有对其进行限制和规定,只能从汇编层面解释

http://bbs.csdn.net/topics/370153775
追问
那这种问题重不重要呢?
如果不用计算机,你觉得最后输出的结果是什么?
追答
语法层面根本没有结果,除非你是编译器的实现者,否则根本没有办法解释该行为
所以最佳的答案就是无解
百度网友83cdc1c
2015-06-14 · TA获得超过5788个赞
知道大有可为答主
回答量:1907
采纳率:100%
帮助的人:806万
展开全部
在printf这类输出函数里,输出对象变量的值是先把优先级高的运算全都算完后才取的值,而参数表达式的计算顺序是从右向左。
就拿这个例子来说,从右向左顺序:
--n,应该先计算--,再取n的值(1),但是别急,这个时候的n值还不能被第一个%d引用,因为后面还有需要先计算的运算;
后面又接着n+=2,应该是先计算+=2,再取n的值(3),同样,这里也先别急,这个时候的n值也还不能被第二个%d引用,因为后面还有需要先计算的运算;
后面又接着++n,应该是先计算++,再取n的值(4),这个时候后面没有需要先计算的运算了,这个时候的n值确定了,被迭代到前面三个%d里引用,所以三个输出都是4。
如果是这样:

printf("%d%d%d", ++n, n+=2, n--);
输出结果就是4,4,2。
n--,应该先取n的值(2)给最后一个%d引用,最后一个输出是2,然后计算--,n的值为(1);
后面又接着n+=2,应该是先计算+=2,再取n的值(3),先别急,这个时候的n值也还不能被第二个%d引用,因为后面还有需要先计算的运算;
后面又接着++n,应该是先计算++,再取n的值(4),这个时候后面没有需要先计算的运算了,这个时候的n值确定了,被引用到前面两个%d里,所以前两个输出都是4。
更多追问追答
追问
--n和n--是不是都等于n=n-1??
追答
--n和n--的区别不在于n的最终值是多少,而在于引用n的值和运算--的先后顺序问题。
--n是先做--再取n的值,n--是先取n的值再对n--。
譬如定义int a, n=2;
情况1:
a=n--; /*这句话执行完,a的值是2,n的值是1*/
情况2:
a=--n; /*这句话执行完,a和n的值都是1*/
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
黑之仙客
2015-06-14 · TA获得超过156个赞
知道小有建树答主
回答量:234
采纳率:89%
帮助的人:135万
展开全部
程序会把printf里的','识别为运算符。
相当于把后面的++n,n+=2,--n运算完后再输出n。
你可以任意改条件,会发现输出的全部是把后面运算完后的n值
因此,不论你后面有多少操作都是可以的
例如如下操作的话输出三个16
printf("%d,%d,%d",++n,n+=2,n++,n+=10);
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
Whutqc
2015-06-14 · 超过20用户采纳过TA的回答
知道答主
回答量:67
采纳率:0%
帮助的人:28.8万
展开全部

VC6.0下,该程序对应的汇编代码:对应输出为4,3, 1

3:     int n=2;
00401028   mov         dword ptr [ebp-4],2
4:     printf("%d,%d,%d",++n,n+=2,--n);
0040102F   mov         eax,dword ptr [ebp-4]
00401032   sub         eax,1
00401035   mov         dword ptr [ebp-4],eax
00401038   mov         ecx,dword ptr [ebp-4]
0040103B   push        ecx
0040103C   mov         edx,dword ptr [ebp-4]
0040103F   add         edx,2
00401042   mov         dword ptr [ebp-4],edx
00401045   mov         eax,dword ptr [ebp-4]
00401048   push        eax
00401049   mov         ecx,dword ptr [ebp-4]
0040104C   add         ecx,1
0040104F   mov         dword ptr [ebp-4],ecx
00401052   mov         edx,dword ptr [ebp-4]
00401055   push        edx
00401056   push        offset string "%d,%d,%d" (0042201c)
0040105B   call        printf (00401090)
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式