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

高分求 printf输出有关问题

2012-03-31 
高分求 printf输出问题?intarr[]{6,7,8,9,10}int*ptrarrprintf( %d,%d,%d ,*ptr,*(++ptr),*(ptr--))

高分求 printf输出问题?
int   arr[]={6,7,8,9,10};
int   *ptr=arr;
printf( "%d,%d,%d ",*ptr,*(++ptr),*(ptr--));
///请问输出是什么?最好说明原因,,谢谢!

[解决办法]
printf( "%d,%d,%d ",*ptr,*(++ptr),*(ptr--));

从右边看起,ptr--生效,++ptr在printf完成后生效,所以第三个输出6,前两个输出7

答案7,7,6
[解决办法]
VC 中 7,7,6
DEV CPP 中 6,6,6
TC 中 6,6,6
[解决办法]
hzcpig() ( ) 信誉:100 2007-08-01 10:11:04 得分: 0


printf( "%d,%d,%d ",*ptr,*(++ptr),*(ptr--));

从右边看起,ptr--生效,++ptr在printf完成后生效,所以第三个输出6,前两个输出7

答案7,7,6

============
没道理 ...
后置 -- 居然执行前生效, 前置++ 语句执行后生效, 绝对不对 ...
[解决办法]
int arr[]={6,7,8,9,10};
int *ptr=arr;
printf( "%d,%d,%d\n ",*ptr,*(++ptr),*(ptr--));

觉得应该是 6, 6, 6
但VS.Net2005编译出来竟然是 7, 7, 6

printf 是 __cdecl的啊,怎么解释? 奇怪
[解决办法]
恩这种题目 见多了 !所以在csdn 被冠名为 月经贴!

答案不一样主要原因是 有写编译器是先算 ",*ptr,接着*(++ptr),最后*(ptr--));
而有些编译器则是 反过来计算的
[解决办法]
int arr[]={6,7,8,9,10};
int *ptr=arr;
printf( "%d,%d,%d,%d\n ",*ptr,*(++ptr),*ptr,*(ptr--));
printf( "%d ",*ptr);
//结果是:
//7,7,6,6
//6Press any key to continue
//因为在C语言中函数的调用是C调用约定。它的参数入栈顺序是从右到左的。
//所以计算顺序是:*(ptr--) -> *ptr-> *(++ptr) -> *ptr
//(这里是分析第一个printf)
//然后,为什么要加第二个printf呢。这是为了解释(++和--运算符)。
//在这里,++ptr肯定是先执行++了,
//关键是在ptr--里,在这里是先得到*ptr,然后ptr--。
//在一般情况下是没什么好说的。主要是这个用在了这个函数里面了。
//在这里,必须要等到这个函数执行完,才会执行ptr--。
//所以结果为:7,7,6,6
//从右到左:*(ptr--) = 6(ptr还没减一),*ptr = 6,
//*(++ptr) = 7(ptr加一),*ptr = 7
//在第二个printf中*ptr = 6
//(因为第一个printf里面的ptr在printf函数退出时减一)
[解决办法]
小小“问题“知识还是不少啊

printf( "%d,%d,%d ",*ptr,*(++ptr),*(ptr--));
--------------------------------------------
在大多数编译器中对函数参数的求值顺序是从右向左的,再从运算符的优先级考虑,逗号运算符的运算级别最低,所以是先*(ptr--)得到的是ptr[0],也就是6,接着是*(++ptr)得到ptr[0] (先自减后自加,等于没有变) 结果还是6,最后是*ptr,不用说了还是 6。

[解决办法]
一个表达式中的子表达式求值顺序是未定义的,依赖编译器的实现

特别,你不能假设表达式是按从左到右求值,例如
int x = f(2) + g(3); // 到底是先调用f()还是先调用g()是未定义的

int i = 1;
v[i] = i++; // undefined result

f1(v[i], i++); // v[i]和i++求值顺序是未定义的

例外:
逗号表达式(,) 逻辑运算符(&&,||)是保证先计算左边的操作数,然后在计算右边的操作数
[解决办法]
int arr[]={6,7,8,9,10};
int *ptr=arr;
printf( "%d,%d,%d ",*ptr,*(++ptr),*(ptr--));
1,函数的结合方式是右结合的,所以先计算ptr--,但是由于不是--ptr,所以指针*(ptr--)所指向的地址实际上没有变,即是arr[0]的地址,表述为&arr[0]==arr,所以值为6
2,继续进行运算++ptr,在运行完ptr--后,ptr变量中的地址值自减一,现在又加上,等于变化回原值,也是arr[0]的地址,所以值也是6
3,这个不用解释,运算到ptr时,*ptr所指向的地址就是arr,所以也是6
/*我只是一个初学的人,错的地方大家不要笑话,我只是用tc编译器,所以其他编译器我并不了解*/
[解决办法]
在VC不同模式下,结果也是两样的:
debug模式下从汇编代码可以发现是先运算好入栈变量地址的值,统一入栈,结果为6,6,6
release模式下,编译器作了优化,只能看到调用函数的地方直接就是push指令,入栈的为7,7,6

热点排行