C语言变量声明中用来声明变量的词有哪些?

没明白你的意思~定义局部变量的數据类型不是肯定在函数里的吗

如果是全局变量肯定不在函数里定义啊。

(我是说一般情况下特例这里不讨论。)

还是说你想像定义變量一样定义函数

可以函数要么声明,要么调用哪来的定义啊?

而且函数的类型是由输出返回的值决定的这和变量定义又扯上什么關系了?

你对这个回答的评价是

可以,函数的类型实际上就是函数返回值的类型其本身也就是个变量

你对这个回答的评价是?

可以僦是个函数返回值的类型

你对这个回答的评价是?

你对这个回答的评价是

    C语言变量声明中全局变量的定义與声明困扰着许多C语言变量声明初学者本文讲述了全局变量定义与声明的用法,而且本为也将阐述这种用法的内在原理我们先从两个錯误例子引入,以下两个例程都在vc6.0平台上测试

例子包含两个C文件(test.c)和(first.c)和一个头文件(test.h)。下边具体展示下它们的代码

一种解决方法:随便在两个C文件中加入一句“int count;”就OK了。例如我们加到test.c中代码如下。 

说明:加入的“int count;”就是对count的定义默认的将其初始化为0。

结论:这種错误原因是“只声明未定义

还是如此,三个文件但是,两个C文件与例程一中的文件一样改动的只是头文件。

可以看到与例程┅仅仅差了一个“extern”关键词。

错误分析:test.h头文件中定义了全局变量count,但是在两个C文件都通过“#include "test.h"”这句话对“int count;”进行了引用所以造成了重复萣义的错误。

一种解决方法:添加一个“first.h”的头文件并且更改first.c的内容,具体更改如下

说明:经过这样的修改,原来的test.c中就包含了count的定義而first.c中就包含了对count的声明,重复定义错误就得到解决

结论:这种错误原因是“多个C程序都包含了定义全局变量的头文件”。 

    我认为“int count;”是对全局变量的定义而“extern int count”是对全局变量的声明,目的是让其他文件也使用这个全局变量下边我们来挖掘全局变量的定义与声明的內涵。

全局变量要么初始化(非零)要么没有初始化(为零)。非零时存储在程序中的data段零时存储在程序的bss段。这谈了程序(.bin或者.hex)嘚结构我再讲一下程序的启动,程序在启动(boot)过程中通常都会运行一个叫bootloader的引导程序,这个引导程序干了很多事情其中有一最重偠的任务就是把程序(test段和rodata段)拷贝到内存,还包括data段的拷贝和bss段初始化我们着重讲一下data段的拷贝和bss段初始化。

    我们的编译器会为我们萣义的全局变量分配内存(地址)而且给我们的全局变量赋初值(写内存或清零),以后我们的程序就会根据需要来读这个全局变量(哋址)或者修改这个全局变量(写内存)初值为零时就在bss段,这个段初始化代码会将这部分清零初值非零时,初始化代码会将全局变量的初值拷贝到data段

    那么,显然全局变量的初值只有一个我们程序中的全局变量的定义就是对全局变量分配内存并赋初值。而全局变量嘚声明是为了跨文件使用全局变量的需要通过"extern"关键词来将全局变量引出。 

顺便说一下C语言变量声明的存储类说明符这能帮助我们加深悝解。

     Extern 出现在顶层或块的外部变量函数与变量声明中表示声明的对象具有静态生存期, 连接程序知道其名字。

    Static 可以放在函数与变量声明中,茬函数定义时,只用于指定函数名,而不将函数导出到链接程序,在函数声明中,表示其后边会有定义声明的函数,存储类型static.在数据声明中,总是表示萣义的声明不导出到连接程序关键字

一种更好的声明与定义方式

说明:这种方法可以只定义一个头文件实现在不同C文件中分别实现定义與声明。“#define GLOBALS”只在当前定义的test.c文件中有效所以在test.c中#include "test.h"预处理后,加入的是int count而first.c中加入的"extern int count;"。其实还有一种书写方法也能实现这个效果。

定义变量的格式非常简单如下所示:

首先要强调的一点是:最后的分号千万不要丢了。变量的定义是一个语句我们说过,语句都是以分号结尾的

“数据类型”表示想要存储什么类型的数据就定义什么类型的变量。想要存储整数就定义成 int 型;想要存储小数就定义成 float 型或 double 型;想要存储字符就定义成 char 型……

“变量名”就是你想给这个变量起个什么名字通常都是用字母。比如:

就表示定义了一个整型变量 i变量名的命名规则稍后会详细地講。

那么变量定义好之后怎么将数放到这个变量里面呢首先要理解的是,将一个数字放到一个变量中这个动作叫“赋值”。“赋”即“给予”的意思所以“给变量赋值”意思就是将一个值传给一个变量。那怎么赋值呢是通过赋值运算符=,赋值的格式是:

它的意思是將=右边的数字赋给左边的变量比如:

这里需要注意的是,这里的=跟数学中的“等于号”是不一样的在刚开始学习的时候,在这一点上夶家很难从数学的思维中转变过来在C语言变量声明中=表示赋值,即将右边的值赋给左边的变量而不是左边的变量等于右边的值。

那C语訁变量声明中有没有表示相等的运算符呢这就是双等号==。这个运算符就与数学中的“等于”是同一个意思了

以上就是变量的定义和赋徝,它们是分成两步写的也可以将它们合成一步,而且事实上在实际编程中用得最多的也是合二为一的写法。那么怎么合在一起呢佷简单,形式如下:

就表示定义了一个变量 i并把 3 赋给这个变量。它与

在定义变量时也可以一次性定义多个变量比如:

这就表示定义了變量 i 和 j。这里需要强调的是当同时定义多个变量时,变量之间是用逗号隔开的千万别写成分号。这是很多新手最容易犯的错误即将逗号和分号记混了。

同样也可以在定义多个变量的同时给它们赋值:

中间还是用逗号隔开最后别忘记输入分号。

最后需要注意的是在較老的 C89/C90 标准(也称 ANSI C 标准)中,变量只能在程序的开头定义或者说变量定义的前面不能有其他非声明或非定义的语句。比如在C语言变量声奣中像下面这种写法就是错误的:

 int j = 4; //这句是错误的因为在它前面有一个给变量i赋值的非定义语句
}
在 V 6.0 或者 VS2010 下编译的时候会提示下面的错误: 泹是这种写法在.cpp文件(C++ 源文件)中是允许的,.cpp文件中可以在程序的任意位置定义变量

其实这与语言本身并没有什么关系,并不是说C语言變量声明中变量就不能定义在程序中间这实际上是与标准有关系的,有些编译器使用的是 C89 标准C89 标准要求所有声明(比如函数声明、变量定义)必须要写在程序、函数或复合语句的开头,而 C99 的新特性允许语句和声明按任意顺序排列只要遵循“先声明后使用”的原则就行。

因为 VC++ 6.0 和 VS2010 遵循的是 C89 标准或者说它不能完全支持 C99 标准,所以它不允许将变量定义在程序中间;而 中 遵循的是 C99 标准所以同样是.c文件,同样昰编写C语言变量声明它就可以将变量定义在程序的任意位置,只要是在使用位置之前即可

其实 C99 标准是比较好的,变量需要的时候才定義缩短了它的生命周期,节省了内存因为只要定义变量,系统就会为它分配内存空间所以如果在前面定义了但是到最后才使用它,那么在使用之前它一直占着内存不放有点浪费。

但是尽管如此大家在编程的时候还是尽量按照 C89 的标准编写,即使在完美支持 C99 标准的编譯器中也最好不要将声明写在程序的中间因为 C89 历时较长,现在它仍然是主流很多编译器仍然只支持 C89 标准或不能很好地支持 C99 标准。所以按 C89 标准编写可移植性更强

上面提到“复合语句”,在复合语句中也可以定义变量所谓语句就是以分号结尾的,而复合语句就是多个语呴组合在一起的语句在C语言变量声明中,用大括号{ }括起来的多个语句称为复合语句

复合语句在流程控制中用得特别多,比如后面将要學习的 if、for、while 一般都是跟复合语句的此时在这些复合语句中也可以定义变量,但是也只能定义在它的开头主函数 main 下面也是用大括号括起來的,所以主函数 main 下的函数体本质上也是一个复合语句是一个大的复合语句。

所以它们还是有共性的也就是说,在C语言变量声明中呮要是用大括号{ }括起来的,那么在它的开头都可以定义变量而且这些在大括号中定义的变量都称为局部变量。此外在大括号外面也可鉯定义变量,叫全局变量这个我们就先不讲了,到后面再讲

我要回帖

更多关于 C语言变量声明 的文章

 

随机推荐