C语言 把我搞晕了

来源:百度知道 编辑:UC知道 时间:2024/06/21 20:04:40
如:{int a=2,*p=&a,*q=&a;
printf("%d %d\n",*p++,*(q++));
p=&a;q=&a;
printf("%d %d\n,"*p,(*q)++);}

输出:2 2
3 2

为何???
后面这条输出语句没错 因为printf是右结合,先算后面(*q)++,就等于a++了,等于3,然后p再来指向a值,自然是3了 哈哈 我分析出来了!

恩,这是一个小的易错点
我帮你分析一下
另外,你后面的输出语句应该是 ++(*p),(*q)++
-------------------------
*p++..*(q++)
效果一样,都是先*p或*q,然后输出,再p++或q++,因为++是后缀运算,所以先用再加
++(*p)
很显然是(*p),然后自增一,再输出,所以为3
(*q)++
应该是(*p),然后输出,再增一,所以为2
-------------------------------
你只要记住,后缀的++是在出现它的表达式语句之后才进行,而前缀++是在当前语句内进行就可以了
比如:s=n++;.....相当于 s=n; n=n+1;
s=++n;.....相当于 n=n+1;s=n;

这里的p和q都是指向a的指针。
你可以暂时把*p和*q都看成a;
那个*(q++)不知道是怎么回事,应该说指针已经越界了。。。。

*p++即是先(*p)传入参数,再a++;
*(q++)先*q传入参数再q++;
*p即是a;
(*q)++即是先(*q)传入参数,再(*q)++;

08vino说的对,需要注意的是比如说i=1的话,那么i++的返回值等于1,i++执行之后i的值就等于2了。

所以printf("%d %d\n",*p++,*(q++)); 里面p++的值就等于p,同样q++的值也等于q,所以输出的都是2

而对于printf("%d %d\n,"*p,(*q)++);} 的我就有点不好理解了,你写的语句明显有错,而且08vino的解释中++(*p) 的返回值的确是3,不过这样的话p指向的内存中的数据,也就是a也会自增1,这样的话输出的结果就一定会是3,3,而不是你所说的3,2。

还是等你把问题修正了在来看吧。

终于清楚了....

首先,C和C++的函数,参数和返回值都是按值传递的,也就是都是用的实参的副本(引用类型除外)