楼主你好。
#include<stdio.h>
double aver(int a[], int n, int *p){
int i,sum=0 ;
*p=0 ;
//printf("%p %d\n",p,*p);//测试代码
for(i=0;i<n;i++){
sum=sum+a[i];
if(a[i]<0){
*p++; //这里按理说不用加括号,但是我发现不加括号有问题
//printf("%p %d\n",p,*p);//测试代码
}
}
return (double)sum/n;//这里需要强制转换为double,否则就只能得到整数
}
main(){
int count=0,x[]={1,0,-1,-2};//{0,12,33,-9,-5,27,80,0,54,63};
double av;
av=aver(x,4, &count);//这里count需要取地址
printf("count: %d\naverage: %.2f\n",count,av);
}
输出:
count: 2
average: -0.50
Press any key to continue
开启测试代码
如果是*p++,可以看到输出:
0012FF44 0
0012FF48 1245064
0012FF4C 4199401
count: 0
average: -0.50
Press any key to continue
如果是(*p)++,可以看到输出:
0012FF44 0
0012FF44 1
0012FF44 2
count: 2
average: -0.50
Press any key to continue
可以看出不加括号是有问题的,连p的值都变了,因此count不会有变化。
我猜测是先进行了p++的操作然后再*。
于是我对*(p++);进行测试,发现果然,与*p++的结果一样。
但是根据我的经验*p++应该是相当于(*p)++的,不知道这里是怎么回事。我的测试环境是VC++6.0。
楼下说错了,事实上:
* 和++ (单目运算)两个处于同一优先级,结合方向是自右向左。
但是!前提是当++在变量【前面】的时候才处理同一优先级。
当++在变量【后面】时,你可以将++的优先级看成最低级的,甚至比逗号运算符的优先级还低。
因此*p++应该是先进行*p,运行完后再进行++运算。
温馨提示:答案为网友推荐,仅供参考