首页 新闻 会员 周边

printf计算参数是从右到左压栈的吗?

1
悬赏园豆:10 [已关闭问题] 关闭于 2014-03-25 13:39

笔试题目中偶尔会考这个知识点,我买的书上解析里面说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
}

 

seven7seven的主页 seven7seven | 初学一级 | 园豆:177
提问于:2014-03-25 09:11
< >
分享
所有回答(3)
0

你这样不好看出,你直接写2个函数,打断点看先进那个就行了.

吴瑞祥 | 园豆:29449 (高人七级) | 2014-03-25 09:33

额 打断点后怎么看先进哪个呢

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,我有点不解了)

支持(0) 反对(0) seven7seven | 园豆:177 (初学一级) | 2014-03-25 09:38

@seven7seven: 你写2个方法,在方法方法里都打上断点.

就能看到先进哪个方法了.不过这个东西是真不清楚怎么回事.从来没考虑过这个问题.

支持(0) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2014-03-25 09:47

@吴瑞祥: 我就是要测试这句话:

a=1;
printf("%d %d\n",a++,a);//12
你说的两个方法怎么写呢,没办法这样测试吧。

支持(0) 反对(0) seven7seven | 园豆:177 (初学一级) | 2014-03-25 09:50

@seven7seven:很久没写C了.可能会错`

printf("%d %d\n",a(),b());

这样行不行的?至于函数内容随便写一些,能打上断点就行

支持(0) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2014-03-25 10:06

@吴瑞祥: 

#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());
}

支持(0) 反对(0) seven7seven | 园豆:177 (初学一级) | 2014-03-25 10:58

@吴瑞祥: 越来越不解了 

直接打印 printf("%d %d\n",a++,a);//输出12

函数调用 printf("%d %d\n",afun(),bfun());//输出11

支持(0) 反对(0) seven7seven | 园豆:177 (初学一级) | 2014-03-25 11:00

@吴瑞祥: 我已经自己解决这个问题了 不过还是谢谢你的帮助

支持(0) 反对(0) seven7seven | 园豆:177 (初学一级) | 2014-03-25 13:38
0

printf("%d %d\n",a++,a); a++指先赋值再加,所以第一个a为1,第二个为2。同样如果是++a,就是先加,再赋值,输出就会是22

单恋 | 园豆:678 (小虾三级) | 2014-03-25 11:28

那请你再解释一下这段代码输出什么:

a=1;
printf("%d %d\n",a,a++);//21

支持(0) 反对(0) seven7seven | 园豆:177 (初学一级) | 2014-03-25 11:52

@seven7seven: 你说了参数是从右到左压栈的,但是++算运算符吧,应该属于先加与后加的问题

支持(0) 反对(0) 单恋 | 园豆:678 (小虾三级) | 2014-03-25 12:01

@单恋: 但是你之前给的答案不符合从右向左压栈吧

支持(0) 反对(0) seven7seven | 园豆:177 (初学一级) | 2014-03-25 12:04

@seven7seven: 

a=1;
printf("%d %d\n",a,a++);//输出21
a=1;
printf("%d %d\n",a++,a);//输出12

这两段代码解释不通

支持(0) 反对(0) seven7seven | 园豆:177 (初学一级) | 2014-03-25 12:05

@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

支持(0) 反对(0) 单恋 | 园豆:678 (小虾三级) | 2014-03-25 13:01

@单恋: 你说的不对 不过还是感谢你的回答了 我已经查到答案了

支持(0) 反对(0) seven7seven | 园豆:177 (初学一级) | 2014-03-25 13:31
0

在处理printf时,压栈顺序为从右往左,也就是说从右往左的计算(“计算”不等于“输出”)。

  a++和++a的压栈的区别:在计算时,遇到a++会记录此时的a的值作为最后的输出结果。遇到a和++a的时候则不会将此时的计算结果作为最终的输出,只会修改a的值,在最终输出的时候都输出a的值(所以++a和a的结果总是一样的)。

seven7seven | 园豆:177 (初学一级) | 2014-03-25 13:33
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册