读书人

《软件工程师面试宝典》中的一道关于C

发布时间: 2012-09-09 09:27:54 作者: rapoo

《程序员面试宝典》中的一道关于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程序默认使用的调用约定,是从右向左传参的!
[解决办法]
不是标准定义 跟编译平台相关
[解决办法]
探讨

又见求值顺序不确定的日经贴。
另外,扔了那破书吧。

读书人网 >C++

热点推荐