标题:在函数中调用全局变量进行运算为什么输出的全局变量仍是原值?
只看楼主
zhengzhihui
Rank: 2
来 自:汕头大学
等 级:论坛游民
帖 子:36
专家分:57
注 册:2009-7-4
结帖率:90%
已结贴  问题点数:20 回复次数:11 
在函数中调用全局变量进行运算为什么输出的全局变量仍是原值?
代码如下:
#include<stdio.h>
int min=0;

void main()
{int fun(int a,int b);
int c=1,d=1;
printf("%d,%d",fun(c,d),min);
getch();
}
int fun(int a,int b)
{
int c;
c=a+b;
min=min+5;
return(c);     [color=Red]  /*经过这一步运算之后,min应该为5,为什么输出时仍为0?*/[/color]return(c);
}

[ 本帖最后由 zhengzhihui 于 2009-8-17 21:23 编辑 ]
搜索更多相关主题的帖子: 函数 c语言 全局变量 
2009-08-17 20:54
wxjeacen
Rank: 7Rank: 7Rank: 7
等 级:禁止访问
帖 子:1291
专家分:628
注 册:2009-3-22
得分:0 
int fun(int a,int b)
{
    int c;
    c=a+b;
    min=min+5;
}

what is the return value of the function??

生命不熄,战斗不止.
2009-08-17 21:09
zhengzhihui
Rank: 2
来 自:汕头大学
等 级:论坛游民
帖 子:36
专家分:57
注 册:2009-7-4
得分:0 
c
返回c

[ 本帖最后由 zhengzhihui 于 2009-8-17 21:22 编辑 ]
2009-08-17 21:20
wxjeacen
Rank: 7Rank: 7Rank: 7
等 级:禁止访问
帖 子:1291
专家分:628
注 册:2009-3-22
得分:0 
printf的执行顺序你知道吧?

生命不熄,战斗不止.
2009-08-17 21:27
godbless
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:216
专家分:950
注 册:2009-7-24
得分:0 
好好想想下面这个程序的结果你就知道了。最好不要写这样的程序,除非你很确定运行的顺序。

#include <stdio.h>
#include <stdlib.h>
 
int main()
{  
 int i=1;
 printf("%d,%d\n",++i,++i);
 system("pause");
 return 0;
}
2009-08-17 21:28
atease
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2009-8-12
得分:0 
所调用的函数中只返回C的值,所调用函数中的MIN与主函数中的MIN不是同一个值,主函数中的MIN由全局变量的值决定,而不是由所调用的函数中的值决定。
2009-08-17 21:34
godbless
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:216
专家分:950
注 册:2009-7-24
得分:0 
回复 6楼 atease

听你这么一说,全局变量还真没什么用了。。
2009-08-17 21:38
wxjeacen
Rank: 7Rank: 7Rank: 7
等 级:禁止访问
帖 子:1291
专家分:628
注 册:2009-3-22
得分:20 
以下是引用atease在2009-8-17 21:34的发言:所调用的函数中只返回C的值,所调用函数中的MIN与主函数中的MIN不是同一个值,主函数中的MIN由全局变量的值决定,而不是由所调用的函数中的值决定。
纯属扯淡。把fun 跟min在printf的位置掉换看看。

生命不熄,战斗不止.
2009-08-17 21:40
prankmoon
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:161
专家分:921
注 册:2009-7-21
得分:0 
楼主问题的结果其实是未定义的,printf中MIN的结果可能是5,也可能是0。

C函数调用时,默认是最右边的参数先入栈,这没错;但先计算那个参数的值就不知道了。考虑下面这段代码:

int a = 1;
int b = 2;
int c = 3;

printf("%d, %d\n", a = a + b, a = a + c);

结果有可能是"3, 6",也有可能是"6, 4"。楼主的问题同此道理。

可以参考这个帖子:
《C语言函数参数压栈顺序与求值顺序的问题》
    --- http://www.

btw:
    在《C陷阱与缺陷》中文版的P58页(3.7节)中间有一段框起来的话:
"注:分隔函数参数的逗号并非逗号运算符。例如,x和y在函数f(x, y)中的求值顺序是未定义的,而在函数g((x, y))中却是确定的先x后y的顺序。在后一个例子中,函数g只有一个参数。这个参数的值是这样求得的,先对x求值,然后x的值被'丢弃',接着求y的值。"

再次btw:
    这个帖子的说法是错误的:
    http://www.
    其打印的结果同样是未定义的。

[ 本帖最后由 prankmoon 于 2009-8-18 01:50 编辑 ]
2009-08-18 01:24
soler
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
帖 子:181
专家分:1077
注 册:2005-7-16
得分:0 
^_^,又学到点东东,还真没注意过这个问题。。。
不过lz的代码,我把printf后面的,min和fun改变位置,min的值也还是5.。。。
莫非我的编译器优化过了。。

int i=1;
   printf("%d%d%d%d%d",i++,i--,--i,++i,i);
这句代码可以看出来是从右往左执行。。。

晕呼了。。。

2009-08-18 02:38



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-283049-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.063905 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved