august 发表于 2007-2-3 14:58:32

再问个程序得出的答案的问题

程序如下:
#define LOW 0
#define HIGH 5
#define CHANGE 2
int i=LOW;
main()
{
int reset(int i);
int i=HIGH;
reset(i=i/2);
printf("i=%d\n",i);
}
reset(int i)
{
i=i<=CHANGE?HIGH:LOW;
return(i);
}
在这里所打印出来的i为什么会是等于2?而不是等于5呢?到底是怎么得出这答案呢?这个在TURBO C中2。5用int 值输出就等于2,那么就是等于CHANGE那i得到的值应该就是HIGH了,怎么会得出2这个答案呢?

Saiholmes 发表于 2007-2-3 15:08:00

- -!!...没看清题,之前的说错~~

#define LOW 0
#define HIGH 5
#define CHANGE 2
int i=LOW;
main()
{
int reset(int i);
int i=HIGH;<------PS.这样这个i是局部变量i,而不是全局变量i...
i=reset(i=i/2);<-----要这样才能接受return
printf("i=%d\\n",i);
}
reset(int i)
{
i=i<=CHANGE?HIGH:LOW;
return(i);
}

august 发表于 2007-2-3 15:16:48

i=reset(i=i/2); <-----要这样才能接受return

这样才能接受return是什么意思呢?不是很懂

Saiholmes 发表于 2007-2-3 15:19:46

reset(int i)这个函数return(i)返回了i值,
相当于reset(i=i/2)计算完后,这个式子的值为5...
所以说必需要i=reset(i=i/2),这样main函数里的i才会被赋值为5...

Saiholmes 发表于 2007-2-3 15:20:58

这和你这句i=i<=CHANGE?HIGH:LOW;
的原理其实是一样的~~

august 发表于 2007-2-3 15:29:40

你的意思是不是说因为程序中没有一个表达式使i值返回,所以那时候i只可以得到i/2的值呢?
但是如果把主函数改为这样
main()
{
int reset(int i);
int i=HIGH;
reset(i/2);
printf("i=%d\\n",i);
reset(i=i/2);
printf("i=%d\\n",i);
这样的话第一个的值是5,它这里不是得到回值吗?

Saiholmes 发表于 2007-2-3 15:33:35

main()
{
int reset(int i);
int i=HIGH;
reset(i/2);
printf("i=%d\\n",i);<----这里是因为i=HIGHT=5
reset(i=i/2);         <----这个式子计算出来的值是5,没错,但你没有把它赋值给i
printf("i=%d\\n",i);<----这里是因为i=i/2=2

LZ没有弄清return的意思,找本书看看吧~~:)

lw 发表于 2007-2-3 18:17:49

其实楼主不妨先把想要的结果说出来
整个程序初看不明白是什么意思……
直到这行:
reset(i=i/2);
printf("i=%d\\n",i);
说明楼主一定觉得i在整个程序是可见的,其实在C语言中,具有形参和实参两种,i只有在作用域范围内有效,也就是说,楼主的reset函数等价于:
int reset(int k)
{
    k=k<=CHANGE?HIGH:LOW;
    return(k);
}
这里没有i,根本和i是没有关系的……所以i的作用域先搞清楚,楼主的问题自然就解决了……至于2的话,实际上那个reset函数就和没有执行一样,因为没有任何作用发生到i上,即实际上main中执行的操作为:

int i=HIGH;
i=i/2;
// reset(i=i/2); // 实际上函数没有任何作用!
printf("i=%d\\n",i); // 执行的是 i = HIGH / 2i.e. i => 5/2 => 2

PS:话说这里是BASIC研究室……
页: [1]
查看完整版本: 再问个程序得出的答案的问题