问一道C语言笔试题

来源:百度知道 编辑:UC知道 时间:2024/04/16 21:57:46
设int arr[]={6,7,8,9,10};

int *ptr=arr;

*(ptr++)+=123;

printf(”%d,%d”,*ptr,*(++ptr));

( )

我做出来的答案是(8 9)
请问对吗?如何不对,请指出错误

设int arr[]={6,7,8,9,10};

int *ptr=arr;

*(ptr++)+=123;

printf(”%d,%d”,*ptr,*(++ptr));
(8,8)/*先计算++ptr,指针变动,就输出两个了.*/

我觉得这个答案和你的想法一样(如果编译器通过的话)
最后数组的值也就变为6,130,8,9,10了
因为 *(ptr++)+=123;<==>*(ptr++)=*(ptr++)+123;
所以就等同于arr[1]=a[0]+123,同时执行了两次ptr=ptr+1;
所以指针后移了两位,应该输出(8,9)了,等我调试了再看看结果再说吧!在win-tc下编译:
实际调试之后结果如下:
数组的值为 129,7,8,9,10,也就是说编译器执行的是
*(ptr)=(*ptr++)+123;ptr++;
printf("%d,%d,%d,%d",*ptr,ptr,*(++ptr),ptr);
的结果是 8,-56,8,-58
而printf("%d,%d,%d,%d",*ptr,ptr,*(ptr++),ptr);的结果却是
8,-56,7,-58了.
我认为这两个的结果是正好相反。
所以呢,我认为这个结果是和编译器有关了.

参数入栈从左往右就是 7,8
从右往左就是 8,8

楼上说的是 参数入栈方式吧 ?

一般的情况是 8,8

TC中答案是8,8,因为TC是按从右到左的顺序处理,也就是先运算右边的*(++ptr)); 然后在运算*ptr,所以两个答案应该是一样的,上机环境是TC,所以就是这个答案哈.
顺便说一声,本人二级就考的C语哈,而且已经过了哈

好象是。。。

(129,7,8,9,10)