C语言变量的定义包括变量存储类型和变量的名称。C语言定义变量的格式:“数据类型 变量名;”,“数据类型”表示想要存储什么类型的数据,“变量名”就是你想给这个变量起个什么名字,通常都是用字母。

变量的定义

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

数据类型  变量名;

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

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

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

int i;

就表示定义了一个整型变量 i。

变量名的命名规则

在定义变量时,变量名可以是字母、数字和下划线的组合。但是也不是随便的组合,要注意以下几个命名规则:

1) 变量名的开头必须是字母或下划线,不能是数字。实际编程中最常用的是以字母开头,而以下划线开头的变量名是系统专用的。

随便打开一个头文件就会看到,它里面所有的变量名、宏名、函数名全是以下划线开始的。

所以为了避免与系统定义的名字产生冲突,在编程的时候,除非要求这么定义,否则永远都不要使用下划线作为一个变量名的开头。

2) 变量名中的字母是区分大小写的。比如 a 和 A 是不同的变量名,num 和 Num 也是不同的变量名。

3) 变量名绝对不可以是C语言关键字,这一点一定要记住!

4) 变量名中不能有空格。这个可以这样理解:因为上面我们说过,变量名是字母、数字、下划线的组合,没有空格这一项。

变量的赋值

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

变量名 =  要赋的值;

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

i = 3;

这就表示将 3 赋给了变量 i,此时 i 就等于 3 了。

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

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

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

数据类型 变量名 = 要赋的值;

比如:

int i = 3;

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

int i;

i =3;

是等价的。

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

int i, j;

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

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

int i = 3, j = 4;

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

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

# include

int main(void)

{

int i;

i = 3;

int j = 4;  //这句是错误的,因为在它前面有一个给变量i赋值的非定义语句

return 0;

}

在 VC 6.0 或者 VS2010 下编译的时候会提示下面的错误:

error C2143: 语法错误 : 缺少“;”(在“类型”的前面)

但是这种写法在.cpp文件(C 源文件)中是允许的,.cpp文件中可以在程序的任意位置定义变量。

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

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

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

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

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

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

所以它们还是有共性的,也就是说,在C语言中,只要是用大括号{ }括起来的,那么在它的开头都可以定义变量。而且这些在大括号中定义的变量都称为局部变量。此外,在大括号外面也可以定义变量,叫全局变量。

声明:

本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。

C语言变量的定义包括变量存储类型和变量的什么?相关推荐

  1. C语言作用域、链接属性和存储类型

    C/C++中作用域详解 作用域 编译器可以确认的4种作用域-代码块作用域.文件作用域.函数作用域和原型作用域,一般来说,标识符(包括变量名和函数名)声明的位置决定它的作用域. (1)代码块作用域 一对 ...

  2. 43 WM配置-作业-库存盘点-定义每种存储类型的类型

    业务背景:定义每一种存储类型的库存盘点模式设定. 事务码:OMNK SPRO路径:SPRO->后勤执行->仓库管理->作业->库存盘点->定义每种存储类型的类型 第1步, ...

  3. C语言学习第五天(存储类和变量的作用域)默认熟悉数据结构

    存储类 存储类定义 C 程序中变量/函数的范围(可见性)和生命周期.这些说明符放置在它们所修饰的类型之前. auto 存储类 auto 存储类是所有局部变量默认的存储类. register 存储类 r ...

  4. 【C语言进阶】函数三要素,变量作用域、生存周期、存储类型

    目录 写在前面 一.函数的用法 1.声明 2.调用 3.定义 形参与实参类型不一致 形参与实参类型一致 函数值类型与返回值类型不一致 函数值类型与返回值类型一致 二.变量的作用域与生存周期 三.变量的 ...

  5. C语言之从内存角度理解不同类型的变量

    我们都知道在C语言中不同类型的变量在内存中的存放位置不同的,从内存角度上讲,不同内存块中存放的代码或者变量其属性(主要是作用域.生命周期.链接属性)是不同的. 首先我们介绍一下作用域.生命周期已经链接 ...

  6. C++:重定义:符号重定义:变量重定义(二):解决变量重定义(const static)

    C++:重定义:符号重定义:变量重定义_hongwen_yul的博客-CSDN博客 上一篇文章中,我们知道解决变量重复定义其中一个办法是:尽量不要头文件中定义变量,头文件只做变量的声明.但是如果我们一 ...

  7. python定义一个list数据来源于变量_python基础知识4--数据类型与变量

    阅读目录 一.变量 二.数据类型 2.1 什么是数据类型及数据类型分类 2.2 标准数据类型: 2.2.1 数字 2.2.1.1 整型: 2.2.1.2 长整型long: 2.2.1.3 布尔bool ...

  8. Linux 命令之 env -- 显示系统的环境变量,定义执行命令时的环境变量

    文章目录 一.命令介绍 二.选项参数 三.命令示例 (一)显示系统的环境变量 (二)从当前环境中删除指定的变量 (三)定义指定的环境变量 (四)在一个修改后的环境下执行命令 一.命令介绍 env命令用 ...

  9. php中session中的变量未定义,我的PHP页面SESSION变量无法储存该怎么办?

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 用phpinfo()查看的配置参数 session Session Support enabled Registered save handlers fi ...

最新文章

  1. GitHub标星1.5w+,从此我只用这款全能高速下载工具
  2. 利用二极管的P-N结的I-V特性测量Boltzmann常数
  3. 中标麒麟mysql导数据_中标麒麟(linux)mysql配置记录
  4. 【PC工具】注意安全,建议使用:安全软件,谷歌输入法下载
  5. Mysql水平分表-后端代码
  6. 自制简易AP柱面定向天线(zz)
  7. 截取全部数值字符并将其转化为数值类型
  8. android 地图定位报错,百度地图定位迷之报错(latitude : 4.9E-324 lontitude : 4.9E-324)
  9. Xilinx ISE14.2新手入门
  10. 高质量发展-协调发展指标体系构建及测算
  11. HTML5植物大战僵尸游戏源码下载
  12. 电脑右下角音量键打不开,调不了音量大小的解决方法
  13. 截止失真放大电路_Multisim基本放大电路仿真实验
  14. rust进水器怎么用_净水器的使用方法和注意事项
  15. Matlab绘图常用设置及函数
  16. 【Oauth2】SpringBoot整合Oauth2实现认证授权
  17. 去除Opera与迅雷的关联
  18. MongoDB 查询昨日/昨天数据
  19. php先乘除还是先加减,加减乘除运算法则是什么?
  20. 【面试记录】长安汽车一面

热门文章

  1. 宣布EAXY:使Java中的XML更容易
  2. 在Java中使用Google的协议缓冲区
  3. 尽早查看针对Java 11的功能
  4. 使用JShell的Java 9 Streams API
  5. 使用JPA和@NamedQueries的Spring数据
  6. days to_days_Java2Days 2012:Java EE
  7. jaxb 解析list元素_JAXB和根元素
  8. 复制模式和扩展模式_扩展剂:模式还是反模式?
  9. jOOQ星期二:拉斐尔·温特豪德(Rafael Winterhalter)正在与字节好友搏斗字节码
  10. java 方法委托托管_Java Web托管选项流程图