烙尘 发表于 2017-9-21 23:20:02

形参传递

//有如下程序
#include   <stdio.h>
int convert(int*data)
{
    return (*data) ++;
}
main( )
{
    intdata = 56;
    convert(&data);
    printf("%d,", data);
    data = convert(&data);//这里data=58
    printf("%d,\n", data);//为什么这里data=57?
}

/*程序运行后的输出结果是


A)   56,57,

B)57,58,

C)   57,57,

D)55,57,
为什么第二个输出是57?*/

烙尘 发表于 2017-9-21 23:23:07

【解析】convert函数每次都定义了一个指针*data,再将指针变量*data对应地址的值进行加一处理,再返回加1前的值作为结果,因此答案为C选项。
答案是这个,但是想不明白

Krant5 发表于 2017-9-22 08:31:56

本帖最后由 Krant5 于 2017-9-22 08:37 编辑

第二个操作也就是data =convert(&data)
等效于data = return (*data)++
返回值为57 先存储到临时变量中,随后 (*data)++,data 为58 ;然后将临时变量57 赋值给 data;结果为57

丶忘却的年少o 发表于 2017-9-22 09:09:20

解析里有一句话:返回加1前的值作为结果。
按照我的理解,后置自增自减运算符具有滞后性,就是说一开始到这个算式能计算,但是值不会变化,等下一次用到这个值才会变化。第一次调用函数返回的还是56,但是在打印的时候用到了data,所以值就会显示出计算后的值57;第二次调用返回57,但是直接赋值给了data,没有给它改变自身的机会,所以答案就是C。
你先理解下,可能我说的也不一定对,但是按照解析里的话应该是这个意思{:10_245:}

桃花飞舞 发表于 2017-9-23 11:45:10

我也是看不懂啊

lizechen 发表于 2017-9-24 15:20:23

convert函数的作用是返回data的值,然后给data加1
main函数中,使用了一次convert之后,data变为57
下一次执行convert的时候因为把返回值赋给了data,
所以此时的data是57
如果没有赋值语句,则data的值会变成58
可以使用如下代码验证
//有如下程序
#include   <stdio.h>
int convert(int*data)
{
    return (*data) ++;
}
main( )
{   int d;
    intdata = 56;
    convert(&data);
    printf("%d,", data);
    d = convert(&data);//这之后data为58
    printf("%d,%d\n", data, d);
}

烙尘 发表于 2017-9-25 22:11:50

Krant5 发表于 2017-9-22 08:31
第二个操作也就是data =convert(&data)
等效于data = return (*data)++
返回值为57 先存储到临时变量 ...

第一个呢?这样说第一个就是56咯,但是两个都是57

烙尘 发表于 2017-9-25 22:16:28

烙尘 发表于 2017-9-25 22:11
第一个呢?这样说第一个就是56咯,但是两个都是57

sorry,仔细看了下,懂了
页: [1]
查看完整版本: 形参传递