C中printf()的的输出和显示顺序,该怎么解决
C中printf()的的输出和显示顺序一直以来,都对printf()里面的输出和显示顺序不大理解如:printf(%d,%d\n,
C中printf()的的输出和显示顺序
一直以来,都对printf()里面的输出和显示顺序不大理解
如:printf("%d,%d\n", a, b);
是从右到左运算吗?先运算b,再运算a?
但是再屏幕上显示却是先输出a,再输出b的
难道这就是传说中的栈?后进先出?
对吗?
还是请大家给我解释下,谢谢
[解决办法]
printf函数是从左往右读取,然后将先读取放到栈底,最后读取的放在栈顶,处理时候是从栈顶开始的,所有我们看见的结果是,从右边开始处理的
[解决办法]
[解决办法]顶1楼
[解决办法]呵呵,接分
[解决办法]最先入栈的最后出栈,
0000 0000
↑
b ;b入栈
0000 0000
↑↑
ab ;a入栈
然后a出栈,b出栈
[解决办法]可以去看下printf源码,并且去看看不定形参的知识
printf("%d,%d\n", a, b); "%d,%d\n"这个也是参数哦,printf就是根据"%d,%d\n"解析后面的参数的个数和类型的,并不是根据入栈顺序,是依赖于实现的
[解决办法]C/C++ code#include<stdio.h>int main(){ int a = 3; printf("%d,%d",a,a++);//输出 4 3 return 0;}
[解决办法]
8楼的明了,一针见血。
[解决办法]
[解决办法]
[解决办法]
[解决办法]
推荐阅读
程序员的自我修养
函数栈
[解决办法]
一楼说的正确.支持.
[解决办法]
学习了
[解决办法]
[解决办法]
这个貌似哪里看到过,有人用汇编解释过了
[解决办法]
学了很久C 还真没注意到这个,8楼的的确能说明问题 但不能说明原理 建议还是看看printf这个库函数
[解决办法]
学习了
[解决办法]
[解决办法]
这个例子只能说明函数调用入栈的顺序,没有标准定义。
楼主更想知道的应该是print函数对无名参数是如何处理的。
print(const char* format, ...)
首先对于这类函数,参数传递是不能用寄存器的,否则后面的参数就不知道从哪里开始了(汇编级别的除外),无名参数按照栈的增长方向 参数入栈顺序,通过第一个参数 format的地址偏移去取。
define _INTSIZEOF(n) ((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1) )
#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) ) //第一个可选参数地址
#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) ) //下一个参数地址
#define va_end(ap) ( ap = (va_list)0 ) // 将指针置为无效
[解决办法]
运算顺序与显示顺序无关
[解决办法]
看看学习
[解决办法]
4: int a = 3;
00401028 mov dword ptr [ebp-4],3
5: int b = 4;
0040102F mov dword ptr [ebp-8],4
6: printf("%d,%d\n", a, b);
00401036 mov eax,dword ptr [ebp-8]
00401039 push eax
0040103A mov ecx,dword ptr [ebp-4]
0040103D push ecx
0040103E push offset string "%d,%d\n" (0042201c)
00401043 call printf (00401080)
vc6.0压栈从右向左,即是,先压入b,在压入a,在字符串"%d, %d".
然后调用printf()函数,先pop字符串"%d,%d",根据字符串,可以知道如何去读取参数(因为%d
说明是4字节,","号就不用管它,输出的时候才理它,如果是%c就是一字节,这个不难办到的。
那么a首先出栈,被处理了,接着b再出栈,被处理了。
而像这样的题目是没有意义的: vc6.0输出是3,3
int a = 3;
printf("%d,%d\n", a, a++);
理解压栈与出栈就好了。
[解决办法]
8楼一针见血
[解决办法]
这个结果跟编译器有关系。在gcc上就是4.3。printf从右边执行的
[解决办法]
问题考虑得太复杂了,简单的看,"%d,%d\n"就描述了输出的格式,a,b就是对应的参数。
至于运算顺序,这个是a,b如果是表达式的时候,先运算哪一个,这个是编译器考虑的问题。
不建议,在调用函数的时候,传入表达式,副作用未知。
[解决办法]
还是8楼明了~~
[解决办法]
和编译器有关的,VC和VS就不相同
[解决办法]
和编译器有关
[解决办法]
------解决方案--------------------
发现很多人的回复都扯题了
8楼的朋友没明白LZ的问题
下面跟8L贴的更没谱
函数参数压栈顺序和函数执行过程是无关的
参数压栈后,函数里可以随意调用,都不分什么顺序不顺序的了
[解决办法]
[解决办法]
从右往左计算,从左往右输出
[解决办法]
[解决办法]
[解决办法]
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编。)
[解决办法]
[解决办法]
不同的编译器实现不同。