| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1433 人关注过本帖
标题:请帮我看看为什么全局变量不能赋值
只看楼主 加入收藏
terry6677
Rank: 1
等 级:新手上路
帖 子:45
专家分:5
注 册:2015-6-29
结帖率:80%
收藏
已结贴  问题点数:20 回复次数:6 
请帮我看看为什么全局变量不能赋值
#include <Stdio.h>
float Max = 0, Min = 0;
main()
{
    float a[10] = { 89,95,87.5,100,67.5,97,59,84,73,90 };
    float aver ( float x[] );
    printf ("%f\nmax is %f\nmin is %f\n",aver(a),Max,Min);
}

    float aver ( float x[] )
    {
        float sum = 0, av;
        int i;

        for ( i = 0; i < 10; i++ )
        {
            sum = sum + x[i];
            if ( x[i] > Max )
                Max = x[i];
            if ( x[i] < Min )
                Min = x[i];
        }
        av = sum / 10;
        return av;
        
    }
为什么Max和Min输出还是0?
2015-12-17 14:36
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
也许要查查逗号运算符吧。另:函数里遍历最大最小数前应该让Max=Mai=x[i],否则当Min的原始值为0,而数组中所有元素大于0时Min无法得到正确的最小数,反之Max得不到最大数。
代码修改如下即可:
程序代码:
#include <Stdio.h>
float Max = 0, Min = 0;
main()
{
    float a[10] = { 89,95,87.5,100,67.5,97,59,84,73,90 };
    float aver ( float x[] );
    printf ("%f\n",aver(a));
    printf("max is %f\nmin is %f\n",Max,Min);
}

    float aver ( float x[] )
    {
        float sum = 0, av;
        int i;
        Max=Min=x[0];
        for ( i = 0; i < 10; i++ )
        {
            sum = sum + x[i];
            if ( x[i] > Max )
                Max = x[i];
            if ( x[i] < Min )
                Min = x[i];
        }
        av = sum / 10;
        return av;
        
    }

能编个毛线衣吗?
2015-12-17 15:03
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
回复 2楼 wmf2014
这不属于“逗号运算符”(如果是逗号表达式,因为存在序列点,反而有确定的输出)
这是函数参数列表形式,其求值顺序是未规定的
2015-12-17 15:43
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:10 
回复 3楼 rjsp
测试了下,应该是c函数参数传递顺序有关,感觉c参数传递时从右往左,代码改成下面样式后可达到楼主的要求:
程序代码:
#include <Stdio.h>
float Max = 0, Min = 0;
main()
{
    float a[10] = { 89,95,87.5,100,67.5,97,59,84,73,90 };
    float aver ( float x[] );
    printf ("%f\nmax is %f\nmin is %f\n",Max,Min,aver(a));
}
float aver ( float x[] )
{
    float sum = 0, av;
    int i;
    Max=Min=x[0];
    for ( i = 0; i < 10; i++ )
    {
        sum = sum + x[i];
        if ( x[i] > Max )
            Max = x[i];
        if ( x[i] < Min )
            Min = x[i];
    }
    av = sum / 10;
    return av;
}

能编个毛线衣吗?
2015-12-18 10:13
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:10 
回复 4楼 wmf2014
跟 参数传递顺序 还是无关(虽然 参数传递顺序 也是未定义的)
仍然是 参数表达式评估顺序 是未定义的

你这只是碰巧在某某编译器上得到正确结果,代码是不具有可移植性的。
2015-12-18 14:26
terry6677
Rank: 1
等 级:新手上路
帖 子:45
专家分:5
注 册:2015-6-29
收藏
得分:0 
谢谢两位版主
2015-12-25 14:43
a382188110
Rank: 2
等 级:论坛游民
帖 子:10
专家分:14
注 册:2011-9-3
收藏
得分:0 
以下是引用wmf2014在2015-12-18 10:13:43的发言:

测试了下,应该是c函数参数传递顺序有关,感觉c参数传递时从右往左,代码改成下面样式后可达到楼主的要求:
#include <Stdio.h>
float Max = 0, Min = 0;
main()
{
    float a[10] = { 89,95,87.5,100,67.5,97,59,84,73,90 };
    float aver ( float x[] );
    printf ("%f\nmax is %f\nmin is %f\n",Max,Min,aver(a));  //我这个是引用:这个在我的vc6.0++中是能正确输出的
}
float aver ( float x[] )
{
    float sum = 0, av;
    int i;
    Max=Min=x[0];
    for ( i = 0; i < 10; i++ )
    {
        sum = sum + x;
        if ( x > Max )
            Max = x;
        if ( x < Min )
            Min = x;
    }
    av = sum / 10;
    return av;
}

// printf ("%f\nmax is %f\nmin is %f\n",aver(a),Max,Min);  这样的输出后Max和Min还是输出 0;
 // 然后我想既然下面的函数 float aver (float x[]) 是求的平均数,将结果返回给 aver()
 // 这个aver()是一个值,还是一个代表该值的地址?
 // 最后我用一个数来尝试代替第一个%f作为输出结果
 main()
{
    float a[10] = { 89,95,87.5,100,67.5,97,59,84,73,90 };
    float i = 0.5;
    float aver ( float x[] );
    aver(a);
    printf ("%f\nmax is %f\nmin is %f\n",i ,Max, Min);
// 0.500000
   max is 100.000000
   min is 59.000000
//printf ("%f\nmax is %f\nmin is %f\n",4.5 ,Max, Min);
// 4.500000
   max is 100.000000
   min is 59.000000
//结果证明,在printf函数中i是一个值,或者地址都不影响它后面的输出
// 那么aver(a)通过return返回的究竟是一个什么东西?
//又或者printf()函数与aver()函数有冲突?
//可能有些主观,求大神解答!

}
2015-12-29 18:50
快速回复:请帮我看看为什么全局变量不能赋值
数据加载中...
 
   



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

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