关于C语言的一个指针问题
inta[]={7,8,9,10,11};int*ptr=a;*(ptr++)+=123;//这句话好像不管用吧printf("%d%d\n",*ptr,*(ptr++)...
int a[]={7, 8, 9, 10, 11};
int *ptr=a;
*(ptr++)+=123; //这句话好像不管用吧
printf("%d %d\n", *ptr, *(ptr++) );
答案输出是9 8 偶不怎么想得通
如果是分行输:
//printf("%d ", *ptr );
//printf("%d\n", *(ptr++) );
这样输出8 8 这个还可以理解.. 展开
int *ptr=a;
*(ptr++)+=123; //这句话好像不管用吧
printf("%d %d\n", *ptr, *(ptr++) );
答案输出是9 8 偶不怎么想得通
如果是分行输:
//printf("%d ", *ptr );
//printf("%d\n", *(ptr++) );
这样输出8 8 这个还可以理解.. 展开
4个回答
展开全部
首先 *(ptr++) 等价于 *ptr++ , 加括号干嘛。
其次*(ptr++)+=123; 无非就是将 a[0]+=123 , 然后 ptr++ 指向a[1]
最后printf("%d %d\n", *ptr, *(ptr++) ); 这里犯了严重的错误。
这里的答案是编译器依赖的, *ptr, *(ptr++)到底先执行谁?
一般编译器是先执行后者, 这样当然是 9,8
但也有部分编译器先执行前者, 这样当然是 8 ,8
也就是编译器先执行谁的问题。 ansi c 未定义,
这种写法当然是不允许在程序中出现!
其次*(ptr++)+=123; 无非就是将 a[0]+=123 , 然后 ptr++ 指向a[1]
最后printf("%d %d\n", *ptr, *(ptr++) ); 这里犯了严重的错误。
这里的答案是编译器依赖的, *ptr, *(ptr++)到底先执行谁?
一般编译器是先执行后者, 这样当然是 9,8
但也有部分编译器先执行前者, 这样当然是 8 ,8
也就是编译器先执行谁的问题。 ansi c 未定义,
这种写法当然是不允许在程序中出现!
展开全部
输出是:8 8,不是9 8
可以理解的
ptr++必须在当前表达式运行完毕后,ptr才执行ptr++。
刚开始ptr指向7
*(ptr++)+=123; 运行完毕,ptr指向8
printf("%d %d\n", *ptr, *(ptr++) );
输出:8 8
ptr在该表达式运行完毕后指向9
我已经运行了,编译环境是vc6.0
可以理解的
ptr++必须在当前表达式运行完毕后,ptr才执行ptr++。
刚开始ptr指向7
*(ptr++)+=123; 运行完毕,ptr指向8
printf("%d %d\n", *ptr, *(ptr++) );
输出:8 8
ptr在该表达式运行完毕后指向9
我已经运行了,编译环境是vc6.0
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
*(ptr++)+=123; //这句话好像不管用吧 -- 当然有用,a[0]现在就是130
// 执行到这个时候,ptr指向 a[1]
printf("%d %d\n", *ptr, *(ptr++));是这样执行的: c中函数参数是从右往左计算的,先算 *(ptr++),那么值为8,且指针向右移动一位,然后再算*ptr,就是9了。
这个我是看了其汇编代码才敢确定的,以后尽量不要这么写吧,就算对,也不容易阅读,搞这种技巧是没意思的。实现同一种功能,代码能让别人容易看懂的才叫牛逼。
// 执行到这个时候,ptr指向 a[1]
printf("%d %d\n", *ptr, *(ptr++));是这样执行的: c中函数参数是从右往左计算的,先算 *(ptr++),那么值为8,且指针向右移动一位,然后再算*ptr,就是9了。
这个我是看了其汇编代码才敢确定的,以后尽量不要这么写吧,就算对,也不容易阅读,搞这种技巧是没意思的。实现同一种功能,代码能让别人容易看懂的才叫牛逼。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你的问题不在++上,在printf()上面。
printf执行参数时是从后面开始的O(∩_∩)O~
printf执行参数时是从后面开始的O(∩_∩)O~
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询