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
这是为什么? 展开
main(){
int n=2;
printf("%d,%d,%d",++n,n+=2,--n);
}
这代码的输出结果按照我的理解是输出 3,4,3
可是为什么执行之后输出结果为 4,4,4
这是为什么? 展开
展开全部
追问
那这种问题重不重要呢?
如果不用计算机,你觉得最后输出的结果是什么?
追答
语法层面根本没有结果,除非你是编译器的实现者,否则根本没有办法解释该行为
所以最佳的答案就是无解
展开全部
在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的值(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*/
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
程序会把printf里的','识别为运算符。
相当于把后面的++n,n+=2,--n运算完后再输出n。
你可以任意改条件,会发现输出的全部是把后面运算完后的n值
因此,不论你后面有多少操作都是可以的
例如如下操作的话输出三个16
printf("%d,%d,%d",++n,n+=2,n++,n+=10);
相当于把后面的++n,n+=2,--n运算完后再输出n。
你可以任意改条件,会发现输出的全部是把后面运算完后的n值
因此,不论你后面有多少操作都是可以的
例如如下操作的话输出三个16
printf("%d,%d,%d",++n,n+=2,n++,n+=10);
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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)
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询