【C 语言】一篇速通常量变量
什么是常量?
常量其实就是在程序运行过程中不可以被改变的量叫做常量。
常量是固定值,在程序执行期间不会改变。这些固定的值,又叫做字面量。
常量可以是任何的基本数据类型,比如整数常量(int)、浮点常量(float,double)、字符常量(char),或字符串字面值,也有枚举常量( enum) 。
常量就像是常规的变量,只不过常量的值在定义后不能进行修改 。
直接常量(字面常量)
整形常量可以理解为是直接使用的整形常数,如:123,456,-456,等......
整形常量可以是:长整型(long int)、短整形(short int)、有符号整形(signed int)、无符号整形(unsigned int)。
实型常量也称之为浮点型(单精度浮点型—float、双精度浮点型—double),由整数和小数部分组成,并用十进制(0~9)位组成的.
浮点常量由整数部分、小数点、小数部分和指数部分组成。您可以使用小数形式或者指数形式来表示浮点常量。
当使用小数形式表示时,必须包含整数部分、小数部分,或同时包含两者。当使用指数形式表示时, 必须包含小数点、指数,或同时包含两者。带符号的指数是用 e 或 E 引入的。
字符常量与之前所介绍的常量有所不同,即要对其字符型常量使用指定的定界符进行限制。
字符常量可以分为两种:1、字符常量(单个字符的单引号) 2、字符串常量(两个及以上双引号)
在这里注意一下:字符常量是区分大小写的、'A'和'a'的字符是不一样的!这两个字符代表不同的字符常量,' '这对单直撇代表着定界符号,不属于字符常量的一部分。在 C 语言中字符串常量时,系统会在字符串后面加"\0",作为字符串的结束标志,如图:
说明: 系统会在字符串尾部添加一个字符串作为结束字符"\0",那么如图所示的长度实际上是 6 的原因!
字符串就是双引号""的内容叫做字符串,包含类似于字符常量的字符:普通的字符,转义序列和通用的字符。
转义字符
当然如果你觉得这个字符比较长的话其实也可以用空格符分开来,进行分析!在 C 语言中有些特定的字符,当它们有反斜杠的时候()就会具有特定的含义,如图所示:
下面的实例显示了一些转义序列字符:
打印结果:
定义常量
修饰常量的关键字是: const ,被 const 关键字所修饰的变量,都是不能被改变的值。
const 前缀声明指定类型的常量,如:const(关键字)int(数据类型)number(变量名) = 5(变量值)
注意:在创建常量时候必须要设置它的初始值,下面就来举个例子:
你自己也可以用 const 关键字修饰下,然后再用变量改变常量值看看可不可以进行改变,我们这里 PAL 左边变量被 const 所给修饰的量,左值指定了 const 的对象,所以它是不能被修改的值。那么现在我们把 PAL 就叫做式常变量。那么为什么叫常变量呢?因为它具有常属性—常属性就是不能被改变的属性,但是其实它的本质上还是变量!举个例子给大家看下:所以还是叫做常变量!所以在这里我们只能用 #define 标识符来进行常量的修饰
点击并拖拽以移动
当然用 const 关键字修饰的话知识一种常量的修饰方式,实际上还有另外一种的修饰能够定义常量那就是用 #define 预处理编译器也是可以定义常量方式的一种方式。
下面举出一个习题:定义符号常量 #define,用这个来打印自己的出生日期
请注意:把常量定义成一个大写是一个很好的习惯!
除了上面所讲述的还有一种常量被称之为:枚举常量 — 可以①①列举的常量 如下示例
运行结果:
什么是变量?
变量其实就是在程序运行过程中不可以被改变的量叫做变量。
其值可以改变的量称为变量。一个变量应该有一个名字,在内存中占据一定的存储单元。
变量定义必须放在变量使用之前。一般放在函数体的开头部分。要区分变量名和变量值是两个不同的概念。
变量顾名思义是可以发生改变的,当你定义一个变量的时候的值,到后面你想改变它的值还是可以发生改变的。
变量的名称可以由字母、数字和下划线字符组成。它必须以字母或下划线开头。
变量的定义
变量定义就是告诉编译器在何处创建变量的存储,以及如何创建变量的存储。
变量定义指定一个数据类型,并包含了该类型的一个或多个变量的列表。如下所示:
type variable_list; 这里的 type 必须是要一个有效的 C 语言当中的数据类型,variable_list 可以是由一个或者多个 C 语言中标识符组成,如下实例:
变量可以在声明的时候被初始化(指定一个初始值)。初始化器由一个等号,后跟一个常量表达式组成,如下所示:type variable_name = value;下面举个例子:
不带初始化的定义:带有静态存储持续时间的变量会被隐式初始化为 NULL(所有字节的值都是 0),其他所有变量的初始值是未定义的。
变量声明
变量声明向编译器保证变量以指定的类型和名称存在,这样编译器在不需要知道变量完整细节的情况下也能继续进一步的编译。
变量声明只在编译时有它的意义,在程序连接时编译器需要实际的变量声明。
变量的声明有两种情况:
一种是需要建立存储空间的,例如:int a 在声明的时候就已经建立了存储空间。
另一种是不需要建立存储空间的,通过使用 extern 关键字声明变量名而不定义它。 例如:extern int a 其中变量 a 可以在别的文件中定义的。
extern 的作用:告知编译器变量在当前范围之外声明过了,被 extern 语句描述过的变量将分派不到任何空间,因为他们在别的地方被定义过了。
extern int number; // 声明,没有定义!
int number; // 声明,定义了!
变量的使用
如下实例:
extern 用法
如果需要在一个源文件中引用另外一个源文件中定义的变量,我们只需在引用的文件中将变量加上 extern 关键字的声明即可!
如果这个程序没有 extern 关键字的话,程序就会报错,因为它们找不到变亮的值🧨
在这段代码中运用到了一个全局变量的知识,在这里跟大家说下:
在所有的函数外部定以的变量叫做:全局变量。
全局变量是可以在整个程序当中进行使用的。
当然在程序当中我们尽量在代码当中少用到全局变量比较。
注意:当局部变量和全局变量同名的话,局部变量的使用优先!
C 中的左值(Lvalues)和右值(Rvalues)
C 中有两种类型的表达式:
左值(lvalue): 指向内存位置的表达式被称为左值(lvalue)表达式。左值可以出现在赋值号的左边或右边。
右值(rvalue): 术语右值(rvalue)指的是存储在内存中某些地址的数值。右值是不能对其进行赋值的表达式,也就是说,右值可以出现在赋值号的右边,但不能出现在赋值号的左边。
变量是左值,因此可以出现在赋值号的左边。数值型的字面值是右值,因此不能被赋值,不能出现在赋值号的左边。下面是一个有效的语句:
int age = 17;
但是下面的这个就是错误的,会生成编译器上的错误!
20 = 10;
作用域和生命周期
所谓的作用域就是☞变量起到作用的范围,也就是变量的有效范围。变量按作用域可以分为两种:局部变量和全局变量💨
作用域规则:
任何一种编程中,作用域是程序中定义的变量所存在的区域,超过该区域变量就不能被访问。C 语言中有三个地方可以声明变量:
在函数或块内部的局部变量
在所有函数外部的全局变量
在形式参数的函数参数定义中
局部变量
在一个函数内部声明的变量是内部变量,它只在本函数内部有效,在本函数之外是不能使用的,这样的变量就是局部变量。
在某个函数或块的内部声明的变量称为局部变量。它们只能被该函数或该代码块内部的语句使用。局部变量在函数外部是不可知的。
如下实例:
#include <stdio.h> int main(void) { //局部变量声明 int num1, num2; int sum; //实际初始化 num1 = 10; num2 = 20; sum = a + b; printf ("num1 = %d, num2 = %d 以及 sum = %d\n", num1, num2, sum); return 0; }
全局变量
在函数外部声明的就是全局变量,全局变量是定义在函数外部,通常是在程序的顶部。全局变量在整个程序生命周期内都是有效的,在任意的函数内部能访问全局变量。全局变量可以被任何函数访问。也就是说,全局变量在声明后整个程序中都是可用的。
如下实例:
#include <stdio.h> /* 全局变量声明 */ int sum; int main () { /* 局部变量声明 */ int a, b; /* 实际初始化 */ a = 10; b = 20; sum = a + b; printf ("sum = %d",sum); return 0; }
形式参数
函数参数,形式参数,被当作该函数内的局部变量,如果与全局变量同名它们会优先使用。
如下实例:
#include <stdio.h> /* 添加两个整数的函数 */ int sum(int a, int b) { printf("value of a in sum() = %d\n", a); printf("value of b in sum() = %d\n", b); return a + b; } /* 全局变量声明 */ int a = 20; int main(void) { /* 在主函数中的局部变量声明 */ int a = 10; int b = 20; int c = 0; int sum(int, int); printf("value of a in main() = %d\n", a); c = sum(a, b); printf("value of c in main() = %d\n", c); return 0; }
运行结果:
生命周期
局部变量的生命周期:进入局部范围的生命开始,出局部范围的生命结束!
全局变量的生命周期:程序的生命周期,这个程序从开始到结束都可以进行使用!
版权声明: 本文为 InfoQ 作者【泽En】的原创文章。
原文链接:【http://xie.infoq.cn/article/8ee6e748687acdb14062f69e2】。文章转载请联系作者。
评论