文章目录
第02章_变量与进制
本章专题脉络
1、关键字(keyword)
定义:被C语言赋予了特殊含义,用做专门用途的字符串(或单词)。
特点:(在2011年定义的)全部关键字都是小写字母
。
类型 | 具体关键字 |
---|---|
控制语句(12 个) | break, case, continue, default, do, else, for, goto, if, return, switch, while |
数据类型(12 个) | char, enum, double, long, float, int, short, signed, struct, unsigned, union, void |
存储类型(4 个) | auto, extern, register, static |
其他关键字(4 个) | const, sizeof, typedef, volatile |
后续,1999年,C99标准增加了5个关键字:inline
、restrict
、_Bool
、_Complex
和_Imaginary
。
2011年,C11标准又增加了7个关键字:_Alignas
、_Alignof
、_Atomic
、_Static_assert
、_Noreturn
、_Thread_local
和_Generic
。
2、标识符(Identifier)
C语言中变量、函数、数组名、结构体等要素命名时使用的字符序列,称为标识符。
标识符的命名规则(必须遵守的硬性规定
)
- 只能由26个英文字母大小写,数字(0-9) 或 _ 组成
- 数字不可以开头
- 不可以是关键字,但可以包含关键字
- 不允许有空格。
- 严格区分大小写字母。比如:Hello、hello是不同的标识符。
标识符的命名建议(建议遵守的软性要求
)
-
在起名字时,为了提高阅读性,要尽量有意义,“见名知意”。如:sum,name,max,year,total 等。
-
不要出现仅靠大小写区分不同的标识符。如:name、Name 容易混淆
-
尽量避免名字中出现数字编号,如value1、value2等,除非逻辑上需要编号。
-
习惯上,所有宏定义、枚举常数、常量(只读变量)全用大写字母命名,用下划线分隔单词。
比如: const double TAX_RATE = 0.08; //TAX_RATE 只读变量
-
系统内部使用了一些下划线开头的标识符(比如两个下划线开头的变量名、一个下划线 + 大写英文字母开头的变量名)。比如,C99 标准添加的类型
_Bool
。为防止冲突,建议用户尽量避免使用下划线开头的标识符。 -
下划线通常用于连接一个比较长的变量名。如:max_classes_per_student。
-
变量名、函数名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写:xxxYyyZzz (驼峰法,小驼峰)。比如:
short stuAge = 20;
,tankShotGame
。
3、变量(variable)
3.1 为什么需要变量
变量是程序中不可或缺的组成单位,最基本的存储单元。
3.2 初识变量
- 变量的概念:
- 内存中的一个存储区域,该区域的数据可以在同一类型范围内不断变化。
- 通过变量名,可以访问这块内存区域,获取里面存储的值。
- 变量的构成包含三个要素:
数据类型
、变量名
、存储的值
- C语言中变量声明的格式:
数据类型 变量名 = 变量值
- 变量的作用:用于在内存中保存数据。
- 使用变量注意:
- C语言中每个变量必须先声明,后使用。
- 不同的数据类型,占用的空间大小不一样。
- 一旦声明,变量的类型就不能在运行时修改。
3.3 变量的声明与赋值
步骤1:变量的声明
格式:
数据类型 变量名; //声明变量的语句必须以分号结尾
举例:
int width,height;
// 等同于
int width;
int height;
步骤2:变量的赋值
变量声明时,就为它分配内存空间,但是不会清除内存里面原来的值。这导致声明变量以后,变量会是一个随机的值。所以,变量一定要赋值以后才能使用。
int age; //变量的声明
age = 18; //变量的赋值
变量的声明和赋值,也可以写在一行。
int age = 18;
注意:声明变量以后,不用忘记初始化赋值!定义变量时编译器并不一定清空了这块内存,它的值可能是无效的数据,运行程序,会异常退出。
3.4 变量的作用域(scope)
- 变量的作用域:其定义所在的一对{ }内。
- 变量只有在其
作用域
内才有效。出了作用域,变量不可以再被调用。 - 同一个作用域内,不能定义重名的变量。
- C 语言的变量作用域主要有两种:文件作用域(file scope)和块作用域(block scope)。
文件作用域(file scope)
指的是,在源码文件顶层声明的变量,从声明的位置到文件结束都有效。
int x = 1;
int main() {
printf("%d\n", x);
return 0;
}
块作用域(block scope)
指的是由大括号( {} )组成的代码块,它形成一个单独的作用域。凡是在块作用域里面声明的变量,只在当前代码块有效,代码块外部不可见。
int main() {
int m = 10;
if (m == 10) {
int n = 20;
printf("%d %d\n", m, n); // 10 20
}
printf("%d\n", m); // 10
printf("%d\n", n); // 超出作用域,报错
return 0;
}
最常见的块作用域就是函数,函数内部声明的变量,对于函数外部是不可见的。 for 循环也是一个块作用域,循环变量只对循环体内部可见,外部是不可见的。
for (int i = 0; i < 10; i++){
printf("%d\n", i);
}
printf("%d\n", i); // 超出作用域,报错
3.5 变量按类型的分类
变量可以按数据类型
来分,也可以按声明的位置
来分(全局变量、局部变量)。本节主讲变量的不同类型。
C 语言中的变量按照数据类型分为:
注意1:这里列举的是C语言的常用类型,后续C语言版本还有新增的类型。
注意2:空类型:void 表示空类型(无类型)。通常应用于函数的返回值类型、函数的参数、指针类型。
注意3:在C语言中,没有
字符串类型
,使用字符数组表示字符串。
4、基本数据类型
4.1 整数类型
4.1.1 类型说明
-
C语言规定了如下的几类整型:短整型(short)、整型(int)、长整型(long)、更长的整型(long long)
-
每种类型都可以被 signed 和unsigned 修饰。其中,
- 使用
signed 修饰
,表示该类型的变量是带符号位的,有正负号,可以表示负值。默认是signed
。 - 使用
unsigned 修饰
,表示该类型的变量是不带符号位的,没有有正负号,只能表示零和正整数。
- 使用
-
bit(位):计算机中的最小存储单位。
byte(字节):计算机中基本存储单元。
1byte = 8bit
类型 | 修饰符 | 占用空间 | 取值范围 |
---|---|---|---|
short [int] | signed | 2个字节(=16位) | -32768 ~ 32767 (- 2 15 2^{15} 215 ~ 2 15 2^{15} 215-1) |
short [int] | unsigned | 2个字节(=16位) | 0 ~ 65535 (0 ~ 2 16 2^{16} 216-1) |
int | signed | 通常4个字节 | -2147483648 ~ 2147483647 (- 2 31 2^{31} 231 ~ 2 31 2^{31} 231-1) |
int | unsigned | 通常4个字节 | 0 ~ 4294967295 (0 ~ 2 32 2^{32} 232-1) |
long [int] | signed | 4个或8个字节 | 4字节时:-2147483648 ~ 2147483647 (- 2 31 2^{31} 231 ~ 2 31 2^{31} 231-1) |
long [int] | unsigned | 4个或8个字节 | 4字节时:-0 ~ 4294967295 (0 ~ 2 32 2^{32} 232-1) |
long long int是C99新增
的:
类型 | 修饰符 | 占用空间 | 取值范围 |
---|---|---|---|
long long [int] | signed | 8个字节(=64位) | -9223372036854775808~ 9223372036854775807(- 2 63 2^{63} 263 ~ 2 63 2^{63} 263-1) |
long long [int] | unsigned | 8个字节(=64位) | 0 ~ 18446744073709551615(0 ~ |