c语言中不允许在函数外部给全局变量赋值
Posted a1232345
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 已写入
以上是关于c语言中不允许在函数外部给全局变量赋值的主要内容,如果未能解决你的问题,请参考以下文章
C 语言指针间接赋值 ( 直接修改 和 间接修改 指针变量 的值 | 在函数中 间接修改 指针变量 的值 | 在函数中 间接修改 外部变量 的原理 )
JS全局变量是全局对象的属性,函数局部变量为啥就不是函数的属性呢?