变量和常量
标识符
在计算机高级语言中,用来对变量、符号常量、函数、数组、类型等命名的有效字符序列统称为标识符(identifier)。
C语言规定标识符:
- 只能由字母,数字和下划线组成。
- 不能以数字开头。
- 字母区分大小写。
不能与关键字和保留字重复。
在传统C语言用法中,一般常量都使用大写字母,变量都使用小写字母。
变量
声明变量
所有变量都必须先声明后使用,尽管某些变量可以通过上下文隐式地声明。
声明变量的一般形式:
C
数据类型 变量名列表;
一个声明指定一种变量类型,后面所带的变量表可以包含一个或多个该类型的变量。
C
short int a,b,i; //有符号短整型变量
unsigned char c; //无符号字符型变量
一个声明语句中的多个变量可以拆开在多个声明语句中声明。
C
short int a;
short int b;
short int i;
unsigned char c;
在声明变量后,应对该变量进行初始化。
初始化变量就是为变量赋一个初始值,只需在变量名后面加上赋值运算符=
和应赋给变量的值。
c
short int a;
a = 10;
unsigned char c;
c = 'A';
可以在声明的同时对变量进行初始化。
C
short int a = 10;
unsigned char c = 'A';
不应将初始化的变量和未初始化的变量放在同一条声明中。
c
short int a,b = 10; //a未初始化,b初始化为10
常量
在程序运行过程中,其值不能被改变的量称为常量。
从字面形式上即可识别的常量称为"字面常量"或"直接常量",即字面常量是没有名字的不变量。
整数常量
可以把整数常量写作十进制、八进制和十六进制。
- 十进制:常量包含 0~9 中的数字,但是一定不能以 0 开头。
- 八进制:常量包含 0~7 中的数字,必须以 0 开头。
- 十六进制:常量包含 0~9 中的数字和 a~f 中的字母,总是以 0x 开头。
十六进制整数常量中的字母可以是大写字母也可以是小写字母。
整数常量的类型通常为 int,如果整数太大超出了范围,则转换成其它范围足够大的整数类型。
可以强制编译器把整数常量作为长整数,需在后边加上字母L
(或l
)。
可以强制编译器把整数常量作为双长整数,需在后边加上字母LL
(或ll
)。
可以指明整数常量是无符号的,需在常量后边加上字母U
(或u
)。
浮点型常量
浮点型常量可以写作为科学计数形式或指数形式。
- 科学计数形式:十进制小数。
- 指数形式:需要在指数数值前放置字母
E
(或e
);eN
(或e+N
)表示 10 的 N 次方,e-N
表示 10 的负 N 次方。
默认情况下,浮点型常量都以双精度数的形式存储。
为了说明浮点型常量是单精度的,需在常量后边加上字母F
(或f
)。
为了说明浮点型常量是扩展精度的,需在常量后边加上字母L
(或l
)。
字符常量
单引号括起来的单个字符称为字符常量。
C语言字符常量通常以ASCII
码值的形式存储。
常用的字符常量ASCII
码值:
- 大写字母
'A'
的ASCII
码值为 65。 - 小写字母
'a'
的ASCII
码值为 97。
转义序列
以\
开头的字符序列称为转义字符。
C语言规定的转义序列包括:
转义字符 | 描述 | ASCII 码值 |
---|---|---|
\a | 响铃 | 0x07 |
\n | 换行 | 0x0a |
\t | 水平制表(跳到下一个tab位置) | 0x09 |
\b | 退格,将当前位置移到前一列 | 0x08 |
\r | 回车,将当前位置移到本行开头 | 0x0d |
\f | 换页,将当前位置移到下页开头 | 0x0c |
\v | 竖向跳格 | 0x0b |
\\ | 反斜杠字符 | 0x5c |
\' | 单引号字符 | 0x27 |
\" | 双引号字符 | 0x22 |
\0 | 空字符 | 0x00 |
\ddd | 位任意八进制值 | nnn |
\xhh | 位任意十六进制值 | nn |
宏定义
简单的宏
符号常量:用#define
指令,指定用一个符号名称代表一个常量。
简单的宏(C标准中称为对象式宏)的定义有如下格式:
C
#define 标识符 替换列表
宏的替换列表可以包括标识符、关键字、数值常量、字符常量、字符串字面量、操作符和排列。
当预处理器遇到一个宏定义时,会做一个"标识符"代表"替换列表"的记录。在文件后面的内容中,不管标识符在哪里出现,预处理器都会用替换列表代替它。
例:
C
#define N 100
#define PI 3.1419
#define CR '\r'
#define EOS '\0'
带参数的宏
带参数的宏(也称为函数式宏)的定义有如下格式:
C
#define 标识符(参数列表) 替换列表
在宏的名字和左括号之间必须没有空格。如果有空格,预处理器会认为是在定义一个简单的宏。
带参数的宏可以包含空的参数列表。
例:
C
#define MAX(x,y) ((x)>(y))?(x):(y))
#define IS_EVEN(n) ((n)%2==0)
现在如果后面的程序中有如下语句:
C
i = MAX(j + k,m - n);
预处理器会将这些行替换为:
C
i = ( (j+k) > (m-n) ? (j+k) : (m-n) );