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

出错代码:

   /*
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 */
#include <stdlib.h>
#include <stdio.h>
int i = ;
i = ; /*
24 * === FUNCTION ======================================================================
25 * Name: main
26 * Description:
27 * =====================================================================================
28 */
int
main ( int argc, char *argv[] )
{
printf("%d.\n", i ); return EXIT_SUCCESS;
} /* ---------- end of function main ---------- */ .c , 顶端
.c| col | 警告: 数据定义时没有类型或存储类 [默认启用]
.c| col | 警告: 在‘i’的声明中,类型默认为‘int’ [-Wimplicit-int]
.c| col | 错误: ‘i’重定义
.c| col | 附注: ‘i’的上一个定义在此
~

思考:

在函数外部对变量的声明,是为了在编译阶段给程序分配内存空间,因此(在函数外部)声明变量的时候对变量进行赋值,只是对分配的内存空间进行初始化。但程序的内部,函数的调用顺序是无序的(并不是在文件中从上到下依次执行),如下图,因此,如果c的语法允许在函数外部对变量赋值,则变量的值是不可预测的。

    * =====================================================================================
*
* Filename: .c
*
* Description:
*
* Version: 1.0
* Created: 2014年10月30日 16时50分05秒
* Revision: none
* Compiler: gcc
*
* Author: 3me (),
* Organization:
*
* =====================================================================================
*/
#include <stdlib.h>
#include <stdio.h>
int i = ;
i = ;
#include <stdlib.h>
/*
24 * === FUNCTION ======================================================================
25 * Name: main
26 * Description:
27 * =====================================================================================
28 */
int
main ( int argc, char *argv[] )
{
i++;
fun1();
return EXIT_SUCCESS;
} /* ---------- end of function main ---------- */
/*
37 * === FUNCTION ======================================================================
38 * Name: fun1
39 * Description:
40 * =====================================================================================
41 */
i = ;
void
fun1 ( <+argument list+> )
{
i = ;
return <+return value+>;
} /* ----- end of function fun1 ----- */ "3.c" 49L, 1215C 已写入

c语言中不允许在函数外部给全局变量赋值的更多相关文章

  1. C语言中可变参数的函数(三个点,“...”)

    C语言中可变参数的函数(三个点,“...”) 本文主要介绍va_start和va_end的使用及原理. 在以前的一篇帖子Format MessageBox 详解中曾使用到va_start和va_end ...

  2. 浅析c语言中的变量(局部变量,外部变量,静态变量,寄存器变量)[转]

    c语言中变量分为四类,分别是 1.auto   自动变量 2.static   静态存贮分配变量(又分为内部静态和外部静态) 3.extern  全程变量(用于外部变量说明) 4.register   ...

  3. C语言中变量名及函数名的命名规则与驼峰命名法

    一.C语言变量名的命名规则:(可以字母,数字,下划线混合使用) 1. 只能以字母或下划线开始:2. 不能以数字开始:3. 一般小写:4. 关键字不允许用(eg:int float=2//error  ...

  4. javascript语言中的一等公民-函数

    简介 在很多传统语言(C/C++/Java/C#等)中,函数都是作为一个二等公民存在,你只能用语言的关键字声明一个函数然后调用它,如果需要把函数作为参数传给另一个函数,或是赋值给一个本地变量,又或是作 ...

  5. 简答的理解C语言中的各种类型函数

    1.变参函数 变长参数的函数即参数个数可变.参数类型不定 的函数.最常见的例子是printf函数.scanf函数和高级语言的Format函数.在C/C++中,为了通知编译器函数的参数个数和类型可变(即 ...

  6. C语言中的可变参数函数的浅析(以Arm 程序中的printf()函数实现为例) .

    我们在C语言编程中会遇到一些参数个数可变的函数,一般人对它的实现不理解.例如Printf(): Printf()函数是C语言中非常常用的一个典型的变参数函数,它 的原型为: int printf( c ...

  7. C语言中生产随机数 rand()函数

    参考资料:C语言中产生随机数 一:如果你只要产生随机数而不需要设定范围的话,你只要用rand()就可以了:rand()会返回一随机数值, 范围在0至RAND_MAX 间.RAND_MAX定义在stdl ...

  8. C++基础 (8) 第八天 数组指针 模板指针 C语言中的多态 模板函数

    1昨日回顾 2 多态的练习-圆的图形 3多态的练习-程序员薪资 4员工管理案例-抽象类和技术员工的实现 employee.h: employee.cpp: technician.h: technici ...

  9. C语言中判断int,long型等变量是否赋值的方法

    博主这段时间在写一些C程序的代码,由于以前对C不是了解很多,故遇到很多瓶颈,当然,其中也有很多有趣的方法可以利用以解决这些难题,下面这个问题就是博主遇到的一个麻烦. 声明了 int ,long 型等局 ...

随机推荐

  1. 6. ClustrixDB 备份恢复

    ClustrixDB备份恢复:   一.传统MySQL的备份/恢复 shell> mysqldump -u user -h clustrix host --single-transaction ...

  2. 浙大PAT CCCC L3-001 凑零钱 ( 0/1背包 && 路径记录 )

    题目链接 分析 : 就是一个 0/1 背包,但是需要记录具体状态的转移情况 这个可以想象成一个状态转移图,然后实际就是记录路径 将状态看成点然后转移看成边,最后输出字典序最小的路径 这里有一个很巧妙的 ...

  3. Mac 找文件或文件夹,以及开启其他程序,截图快捷键

    Mac 图形化界面对操作惯 Win 的人来说比较奇怪. 有一组超级有用的快捷键,control + 空格 按下后会出现一个搜索框,输入计算机上任何你想要找的资源即可打开. 截取全屏:快捷键(Shift ...

  4. go语言系列--输出正弦函数

    实验所用到的标准库和包 库与包之间的理解可以类比成:数据库种的库和表 库名 作用 image 常见图形格式的访问及生成 log 日志记录库 math 数学库 os 操作系统平台不依赖平台操作封装 查看 ...

  5. ubuntu下安装apatch

    在Ubuntu上安装Apache,有两种方式:1 使用开发包的打包服务,例如使用apt-get命令:2 从源码构建Apache.本文章将详细描述这两种不同的安装方式. 方法一:使用开发包的打包服务—— ...

  6. Linux NTP服务器的搭建及client自动更新时间

    Network Time Protocol(NTP)是用来使计算机时间同步化的一种协议,它可以使计算机对其服务器或时钟源(如石英钟,GPS等等)做同步化,它可以提供高精准度的时间校正(LAN上与标准间 ...

  7. ros 下常用的依赖库

    <buildtool_depend>catkin</buildtool_depend> <build_depend>nav_msgs</build_depen ...

  8. PropertyInfo、FieldInfo、MemberInfo的区别

    public class TestClass { ;//私有一律获取不到 public int b { ; } ; } } ; } public static void TestMethod() { ...

  9. -----------------解决天天模拟器不能连接adb命令

    cmd------输入adb connect 127.0.0.1:6555即可 查询日志:adb shell "logcat |grep OkHttp"

  10. windows下eclipse打不开

    报错找不到jre等东西 因为eclipse到不到javaw.exe 将其写入eclipse.ini即可 在eclipse.ini的前面加上 -vm D:\dev_tool\java\jdk1.7.0_ ...