c语言中不允许在函数外部给全局变量赋值

今天,在写条件编译的时候,出现了在函数外部给全局变量赋值的情况,gcc报错,那么c语言为什么不允许在函数外部给变量赋值呢?为什么声明变

量的时候可以对变量进行赋值?

出错代码:

复制代码
  1 /*
  2  * =====================================================================================
  3  *
  4  *       Filename:  2.c
  5  *
  6  *    Description:  
  7  *
  8  *        Version:  1.0
  9  *        Created:  2014年10月30日 16时25分41秒
 10  *       Revision:  none
 11  *       Compiler:  gcc
 12  *
 13  *         Author:  3me (), 
 14  *   Organization:  
 15  *
 16  * =====================================================================================
 17  */
 18 #include <stdlib.h>
 19 #include <stdio.h>
 20 int i = 0;
 21 i = 3;
 22 
 23 /* 
 24  * ===  FUNCTION  ======================================================================
 25  *         Name:  main
 26  *  Description:  
 27  * =====================================================================================
 28  */
 29     int
 30 main ( int argc, char *argv[] )
 31 {
 32     printf("%d.\n", i );
 33 
 34     return EXIT_SUCCESS;
 35 }       /* ----------  end of function main  ---------- */
 36 
2.c                                                                                                                                          1,1           顶端
  1 2.c|21 col 1| 警告: 数据定义时没有类型或存储类 [默认启用]                                                                                                 
  2 2.c|21 col 1| 警告: 在‘i’的声明中,类型默认为‘int’ [-Wimplicit-int]
  3 2.c|21 col 1| 错误: ‘i’重定义
  4 2.c|20 col 5| 附注: ‘i’的上一个定义在此
~                                                    
复制代码

思考:

在函数外部对变量的声明,是为了在编译阶段给程序分配内存空间,因此(在函数外部)声明变量的时候对变量进行赋值,只是对分配的内存空间进

行初始化。但程序的内部,函数的调用顺序是无序的(并不是在文件中从上到下依次执行),如下图,因此,如果c的语法允许在函数外部对变量赋

值,则变量的值是不可预测的。

复制代码
  2  * =====================================================================================
  3  *
  4  *       Filename:  3.c
  5  *
  6  *    Description:  
  7  *
  8  *        Version:  1.0
  9  *        Created:  2014年10月30日 16时50分05秒
 10  *       Revision:  none
 11  *       Compiler:  gcc
 12  *
 13  *         Author:  3me (), 
 14  *   Organization:  
 15  *
 16  * =====================================================================================
 17  */
 18 #include <stdlib.h>
 19 #include <stdio.h>
 20 int i = 0;
 21 i = 1;
 22 #include <stdlib.h>
 23 /* 
 24  * ===  FUNCTION  ======================================================================
 25  *         Name:  main
 26  *  Description:  
 27  * =====================================================================================
 28  */
 29     int
 30 main ( int argc, char *argv[] )
 31 {
 32     i++;
 33     fun1();
 34     return EXIT_SUCCESS;
 35 }       /* ----------  end of function main  ---------- */
 36 /*      
 37  * ===  FUNCTION  ======================================================================
 38  *         Name:  fun1
 39  *  Description:  
 40  * =====================================================================================
 41  */
 42 i = 2;
 43     void
 44 fun1 ( <+argument list+> )
 45 {
 46     i = 3;
 47     return <+return value+>;
 48 }   /* -----  end of function fun1  ----- */
 49 
"3.c" 49L, 1215C 已写入                                  
复制代码
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值