C语言中 int x=10; printf("%d%d%d",++x,++x,++x);为啥运行结
发布网友
发布时间:2024-10-23 20:49
我来回答
共3个回答
热心网友
时间:2024-10-25 22:15
这个是和函数参数的压栈顺序导致的,然而编译出来的c/c++程序的参数压栈顺序只和编译器相关。
例如:
VC6:
调用约定 堆栈清除 参数传递
__cdecl 调用者 从右到左,通过堆栈传递
__stdcall 函数体 从右到左,通过堆栈传递
__fastcall 函数体 从右到左,优先使用寄存器(ECX,EDX),然后使用堆栈
这个要根据你编译器的规则而定,所以汇蓝鸟师兄的答案才是正确的。
我这里VS2012,测试代码如下:
#include <stdio.h>
void __fastcall printf__fastcall(int _left,int _right )
{
printf("__fastcall:\t\t_right=0x%x,_right=0x%x\n",&_left,&_right);
}
void __stdcall printf__stdcall(int _left,int _right)
{
printf("printf__stdcall:\t_right=0x%x,_right=0x%x\n",&_left,&_right);
}
void __cdecl printf__cdecl(int _left,int _right)
{
printf("printf__cdecl:\t\t_right=0x%x,_right=0x%x\n",&_left,&_right);
}
int main( int argc, char* argv[] )
{
printf__fastcall(1,2);
printf__stdcall(1,2);
printf__cdecl(1,2);
return 0;
}
热心网友
时间:2024-10-25 22:23
ub,不同的编译器结果可能不一样,也就是说结果可能是13 12 11 ,也可能是 11 12 13,取决于编译器是怎么实现的
热心网友
时间:2024-10-25 22:20
简单的说,因为默认情况下,函数参数的计算方式是从右向左的。