首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

为什么会得到不同的结果?解决思路

2012-02-27 
为什么会得到不同的结果?希望高人给指点迷津。请看下面的一段程序intarr[]{6,7,8,9,10}int*ptrarr*(ptr

为什么会得到不同的结果?
希望高人给指点迷津。
请看下面的一段程序
int   arr[]   =   {6,7,8,9,10};
int   *ptr   =   arr;
*(ptr++)+=123;
printf( "%d,%d ",*ptr,*(ptr++));
VC6.0输出的结果是:8,8

当把最后一行输出改成下面两行时:
printf( "%d ",*ptr);
printf( "%d ",*(ptr++));
输出是;7   8

当把*(prt++)+=123;改成   *(ptr+1)+=123;时却又是一个结果。
这是为什么?

[解决办法]
printf( "%d,%d ",*ptr,*(ptr++));
VC6.0输出的结果是:8,8

这个时候*ptr指向arr[1];但是+123给的是arr[0]。
ptr++改变了ptr++的value,而*(ptr+1)没有改变ptr。
[解决办法]
1,printf在处理++,--时,使用上不方便,必须清楚printf的内部实现.建议printf中不要使用++,--
2,(ptr+1)相当于(++ptr),与(ptr++)不一样.
[解决办法]
跟踪到printf里面,不过是多参数的.看不明白..
int __cdecl printf (
const char *format,
...
)
/*
* stdout 'PRINT ', 'F 'ormatted
*/
{
va_list arglist;
int buffing;
int retval;

va_start(arglist, format);

_ASSERTE(format != NULL);

_lock_str2(1, stdout);

buffing = _stbuf(stdout);

retval = _output(stdout,format,arglist);

_ftbuf(buffing, stdout);

_unlock_str2(1, stdout);

return(retval);
}

[解决办法]
明白了一部分,就是参数传递的时候是从右向左压栈的。
但是还是有个小地方不明白;下面的:
#include <stdio.h>
//#include <stdlib.h>
int main()
{
int arr[] = {6,7,8,9,10};
int *ptr = arr;
*(ptr++)+=123;
printf( "%d,%d ",*(++++ptr),*(ptr));
//printf( "%d,%d ",*(++ptr),*(ptr));
/*
int arr[] = {6,7,8,9,10};
int *ptr = arr;
*(ptr++)+=123;
printf( "%d ",*ptr);
printf( "%d\n ",*(++ptr));
*/
for (int i=0;i <5;i++)
{
printf( "%d ",arr[i]);
}
//system( "pause ");
return 0;
}
结果是:9,8
怎么看都不明白..
-----------------------------

c语言中参数是从右往左入栈的。


可是我的dev出来的结果是 9 7
---------------

热点排行