《软件工程师面试宝典》中的一道关于C语言的看似简单的小题
《程序员面试宝典》中的一道关于C语言的看似简单的小题C/C++ code#include stdio.hint main(){int arr[]
《程序员面试宝典》中的一道关于C语言的看似简单的小题
C/C++ code#include <stdio.h>int main(){ int arr[] = {6,7,8,9,10}; int * ptr = arr; *(ptr++) += 123; printf("%d, %d\n",*ptr,*(++ptr)); return 0;}
在我的VS2010和VC++6.0也就是微软编译器上答案是8 8。答案上还写着是在C中计算参数时 printf是从右到左压栈。
所以我很想知道,在非微软编译器上这个也是右到左压栈?(或者和答案不一样?)以确定到底这个在标准C中是否是未定义行为?
[解决办法]在编译器上这个是右到左压栈,还是从左到右,这个在标准C中未定义.
printf("%d, %d\n",*ptr,*(++ptr));
也就是你先计算*(++ptr)还是先计算*ptr的顺序
[解决办法]printf函数在其他编译器上也是从右向左入站,c语言默认的函数默认入站顺序就是从右向左。你给出的例子中的printf包含有未定义行为时因为那个ptr的操作。c中队函数调用操作符中表达式的求值顺序是没有规定的。拿你给的例子来说就是,*ptr和*(++ptr)这两个表达式的求值顺序是又编译器决定的。不同的编译器求值顺序不一定一样。显然你的vc编译器是先求了*(++ptr)后求了*ptr,但是有些编译器可能不按这个顺序。注意,表达式的求值顺序和参数入栈的顺序不是一回事。
[解决办法]又见求值顺序不确定的日经贴。
另外,扔了那破书吧。
[解决办法]就是传参顺序的问题,不用太过纠结!
你可以看下 函数调用约定 的相关知识!
__cdecl是C/C++和MFC程序默认使用的调用约定,是从右向左传参的!
[解决办法]不是标准定义 跟编译平台相关
[解决办法]