Chapter1 C语言基础
1.1 存储
存储类型
auto-局部变量(自动变量):
- auto是所有局部变量默认的存储类
- auto定义一个自动的局部变量,每次执行到定义该变量时,都会产生一个新的变量,并对其重新初始化
- 函数中的变量默认为auto存储类,在函数开始时被创建,在函数结束时被销毁
register-寄存器变量:
- register存储类用于定义存储在寄存器而不是RAM中的局部变量
- 变量访问速度更快,但不能直接取地址
- 用于需要快速访问的变量,比如计数器
- 如果寄存器满了,被修饰的变量会默认回到auto
static-静态局部/全局变量:
- static修饰局部变量是和auto相对而言的,两者的作用域都仅限于声明局部变量的函数之中,但static修饰的局部变量初始化操作只在第一次执行时起作用。在随后的运行过程中,变量将保持语句块上一次执行时的值
- static修饰全局变量会使其作用域限制在声明它的文件内
extern-全局变量:
- 非静态的全局变量默认的存储型为extern
- extern存储类用于声明在其他文件中声明的全局变量或函数,这些全局变量或函数将要用到但可能尚未定义
- 使用extern关键字时,不会为变量分配任何存储空间,而只是指示编译器该变量在其他文件中定义
存储位置
栈区:
- 局部变量(包括const修饰的)
- 函数形参和返回值
堆区:
- malloc动态分配
静态存储区(全局区):
- 全局变量
- 静态变量
常量存储区:
- 字符串
- const修饰的全局变量
1.2 运算符
优先级和结合方向:
| 运算符(优先级由高到低) | 结合方向 | 
|---|---|
| 后缀:() [] -> | $\rightarrow$ | 
| 一元:! ~ + - ++ -- * & (type)sizeof | $\leftarrow$ | 
| 乘除:/ * % | $\rightarrow$ | 
| 加减:+ - | $\rightarrow$ | 
| 移位: ≪ ≫ | $\rightarrow$ | 
| 关系:< > <= >= | $\rightarrow$ | 
| 相等:== != | $\rightarrow$ | 
| 位与:& | $\rightarrow$ | 
| 位异或:^ | $\rightarrow$ | 
| 位或:| | $\rightarrow$ | 
| 逻辑与:&& | $\rightarrow$ | 
| 逻辑或:|| | $\rightarrow$ | 
| 条件:?: | $\leftarrow$ | 
| 赋值:= += -= *= \= %= | $\leftarrow$ | 
| 逗号:, | $\rightarrow$ | 
符号介绍:
- 
≪(左移运算符): 
 将一个数的二进制向左移动指定的位数,并在右侧补上0.语法形式为x≪n,其中x表示要进行左移操作的数,n表示要左移的位数。其实际效果是将x乘上2的n次方。
- 
?:(三目运算符): 
 语法形式为(判别式)?(表达式1):(表达式2),如果判别式为真(值为1),则返回表达式1;如果判别式为假(值为0),则返回表达式2。
- 
++(自增运算符): 
 ++n的运算顺序是:先执行n=n+1,再将n新的值作为表达式++n的值
 n++的运算顺序是:先将n的原值作为表达式n++的值,再执行n=n+1
 自增运算符和自减运算符的运算对象不能为常量(3++)或表达式(++(i+j))
- 
~(取反位运算符): 
 将一个数的二进制按位取反
- 
&(按位“与”运算符): 
 将两个数二进制下对应的位一一进行与运算,即对应位均为1时结果才为1。
Example
例如a=84,b=59,则a&b==16。
01010100
00111011(&)
————
00010000  
- 
|(按位“或”运算符): 
 将两个数二进制下对应的位一一进行或运算,即对应位有1时结果即为1。
- 
^(按位“异或”运算符): 
 将两个数二进制下对应的位一一进行异或运算,即对应位一个为1另一个为0时结果才为1。
1.3 输入输出标准
scanf()/printf()
格式控制字符:
| 格式控制字符 | 对应类型 | 
|---|---|
| %d | 十进制整数 int | 
| %ld | 长整型 long long | 
| %o | 八进制整数 | 
| %x | 十六进制整数 | 
| %u | 十进制无符号数 unsigned | 
| %lu | 无符号长整型 unsigned long long | 
| %f | 单精度浮点数 float | 
| %lf | 双精度浮点数 double | 
| %e | 浮点数(输出) | 
| %c | 字符 | 
| %s | 字符串 | 
| %p | 十六进制指针地址 | 
转义字符:
| 转义字符 | 含义 | 
|---|---|
| \n | 换行 | 
| \r | 回车 | 
| \t | 水平制表(Tab) | 
| \b | 退格 | 
| \\ | 反斜线 | 
| \" | 双引号 | 
| \' | 单引号 | 
| \? | 问号 | 
Note
反斜线、双引号、单引号和问号无法直接输出,因为它们有特殊的用途。
getchar()/putchar()
以单个字符作为读写对象。
gets()/puts()
以字符串作为读写对象。
1.4 特殊语句/函数/运算符
switch语句
switch语句用于选择项较多的判断。
goto语句
goto语句可以快速跳转代码,常用于跳出多重循环或跳到函数的末尾,但不建议使用。
enum语句
enum 枚举名 {枚举元素1,枚举元素2,···};
- enum类型被当作- int来处理
- 枚举类型连续时可以使用for来遍历
time()函数
- 标准库:time.h
- time(0)返回一个长整数,即格林尼治时间1970年1月1日00:00:00到当前时刻的时长,单位为秒。
- time()函数可用于计算代码运行的时间,例如:
malloc()函数
- 标准库:stdlib.h
- malloc()函数分配所需的内存空间,并返回一个指向它的指针
typedef语句
typedef用于类型名的替换。