笔试题目中偶尔会考这个知识点,我买的书上解析里面说printf计算参数是从右到左压栈,可我自己写了一个小代码测试了一下,发现结果并非如此,哪位可以给解释解释呢?
#include <iostream>
#include <stdio.h>
using namespace std;
int main(){
int a=1;
cout<<a++<<" "<<a<<endl;//12
a=1;
cout<<a<<" "<<a++<<endl;//21
a=1;
printf("%d %d\n",a,a++);//21
a=1;
printf("%d %d\n",a++,a);//12
}
你这样不好看出,你直接写2个函数,打断点看先进那个就行了.
额 打断点后怎么看先进哪个呢
a=1;
printf("%d %d\n",a,a++);//21
我就是这样看的,如果是从右到走,就应该先输出a++(输出1),再输出a(此时值为2),打印21(验证代码时确实打印了21,打印正确)
a=1;
printf("%d %d\n",a++,a);//12
这句应该先输出a(值为1),后输出a++(值也为1),打印11(验证代码时打印了12,我有点不解了)
@seven7seven: 你写2个方法,在方法方法里都打上断点.
就能看到先进哪个方法了.不过这个东西是真不清楚怎么回事.从来没考虑过这个问题.
@吴瑞祥: 我就是要测试这句话:
a=1;
printf("%d %d\n",a++,a);//12
你说的两个方法怎么写呢,没办法这样测试吧。
@seven7seven:很久没写C了.可能会错`
printf("%d %d\n",a(),b());
这样行不行的?至于函数内容随便写一些,能打上断点就行
@吴瑞祥:
#include "stdafx.h"
#include <iostream>
#include <stdio.h>
using namespace std;
int a=1;
int afun(){
printf("调用afun(){a++;}\n");
return a++;
}
int bfun(){
printf("调用bfun(){a;}\n");
return a;
}
void main(){
printf("%d %d\n",afun(),bfun());
}
@吴瑞祥: 越来越不解了
直接打印 printf("%d %d\n",a++,a);//输出12
函数调用 printf("%d %d\n",afun(),bfun());//输出11
@吴瑞祥: 我已经自己解决这个问题了 不过还是谢谢你的帮助
printf("%d %d\n",a++,a); a++指先赋值再加,所以第一个a为1,第二个为2。同样如果是++a,就是先加,再赋值,输出就会是22
那请你再解释一下这段代码输出什么:
a=1;
printf("%d %d\n",a,a++);//21
@seven7seven: 你说了参数是从右到左压栈的,但是++算运算符吧,应该属于先加与后加的问题
@单恋: 但是你之前给的答案不符合从右向左压栈吧
@seven7seven:
a=1;
printf("%d %d\n",a,a++);//输出21
a=1;
printf("%d %d\n",a++,a);//输出12
这两段代码解释不通
@seven7seven: 之前的回答貌似有问题,你就略过吧。但是根据你说的。这段代码还是能理解的啊。a=1;
printf("%d %d\n",a,a++);//输出21
a=1;
printf("%d %d\n",a++,a);//输出12
参数是从右往左执行的。第一行,a++输出2,a输出1。a是值类型。c#输出的就是:11。语言不同。
第二行,a输出1,a++输出2。你在理解一下。C#输出:1,2
@单恋: 你说的不对 不过还是感谢你的回答了 我已经查到答案了
在处理printf时,压栈顺序为从右往左,也就是说从右往左的计算(“计算”不等于“输出”)。
a++和++a的压栈的区别:在计算时,遇到a++会记录此时的a的值作为最后的输出结果。遇到a和++a的时候则不会将此时的计算结果作为最终的输出,只会修改a的值,在最终输出的时候都输出a的值(所以++a和a的结果总是一样的)。