c语言指针作为函数参数的题目。

img

这一题正确答案是C,第一个输出值是57我是明白的,第一次运行函数的时候改了data地址里的值变成了57,可是第二次不也进行了一样的操作吗,为什么不是58呢?

这么说吧
a=0,b=0
如果a=b++,那么a是等于0,而不是1,先执行的是a=b,然后再执行b++。
如果a=++b,那么a是等于1,先执行的是++b,然后执行的a=b。
这就是c语言特别的地方

因为函数里面用了后++,返回的数据是加1前的数据。返的是57,这个57赋值给了data,把函数里面加1的效果给冲掉了
函数逻辑相当于下面的功能:
int convert(int * data) {
int tmp = *data;
*data = *data +1;
return tmp;
}

convert函数,在执行return (data)++;的时候,先返回(data),然后在执行(*data)++
所以,在第一次convert函数执行的时候,convert实际返回的是56,然后data的值++,data=57,所以第一次printf打印的是57
第二次执行convert函数的时候,convert返回的是57,所以外部的data = convert(&data)中,等号左边的data的值就是57

少研究这种a++,++a的问题,这就是出题在内卷,没有任何意义,实际编程中为了可读性和各平台的统一性,绝对要避免++的同时赋值
先说第一个为什么是57,因为++和print不在同一行,那++当然会执行了,执行完++才输出的,当然就是56++变57
第二个为什么不是58,因为a=b++是先执行的赋值,再执行的++,这里又有迷惑点,就是内外变量用了同一个名字,你把函数里面的变量替换成a,外面替换成b,那么a++就只影响a本身,并不会传递给b,能理解了吗?data=convert(&data)相当于int c=convert(&data);data=c;这里前后里外都用同名变量,是最绕的。

应为++在后面