zoukankan      html  css  js  c++  java
  • 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.
    ", 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 已写入                                  
  • 相关阅读:
    【2021-03-03】人生十三信条
    【2021-03-02】勤奋和努力是积极乐观的自然导向
    【2021-03-01】解铃还需系铃人
    【2021-02-28】人生十三信条
    【2021-02-27】人生十三信条
    【2021-02-26】人生十三信条
    【2021-02-25】“活到老,做到老”的观念趋势
    【一句日历】2021年3月
    【2021-02-24】理想化中的积极进取精神
    机器人走方格
  • 原文地址:https://www.cnblogs.com/3me-linux/p/4063154.html
Copyright © 2011-2022 走看看