printf函数遵守C调用规范,即参数
从右至左 压栈,堆栈由调用者平衡。(这种从右至左的方式不会随着编译器,机器的不同而不同) )。
[code]
printf("%d,%d", i, i++ ); 产生的汇编码大致像下面这样:
mov eax,dword ptr [i]
push eax //最右边那个i的值被压入栈中
inc eax //i++
mov dword ptr[ i ], eax
mov edx,dword ptr [i]
push edx //第二个i的值被压入栈中
push offset string "%d,%d" //字符串 "%d,%d"的地址被压入栈中
call printf //跳转到函数print
add esp, 12 //平衡堆栈
[/code]
有几个小题帮助分析:
1.
#include <stdio.h>
int main()
{
char * p = "abcdefg";
printf("%c%", *p,*(p++));
return 0;
}
输出结果:ba
2.
#include <stdio.h>
int main()
{
char * p = "abcdefg";
printf("%c%c%c", *p,*(p++), *(++p));
return 0;
}
输出结果:bbc
3.
#include <stdio.h>
int main()
{
char * p = "abcdefg";
printf("%c%c", *p,*(p+3));
return 0;
}
输出结果:ad
本文深入探讨了C语言中printf函数的内部实现方式,通过具体实例展示了参数传递、栈操作及汇编码生成的过程。进一步分析了在不同场景下使用printf函数时的输出结果,为读者提供了理解C语言底层实现与实际应用的全面视角。
1481

被折叠的 条评论
为什么被折叠?



