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
用于类型名的替换。