要点
数据表示
| 进制 | 表示 | 举例 |
|---|---|---|
| 二进制 | 后缀加b | 111b |
| 八进制 | 前缀加0 | 012 |
| 十六进制 | 前缀加0x或0X | 0xFF,0xff |
运算符优先级
| 优先级 | 运算符 | 名称或含义 | 使用形式 | 结合方向 | 说明 |
|---|---|---|---|---|---|
| 1 | [ ] | 数组下标 | 左到右 | ||
| 1 | ( ) | 函数调用 | 左到右 | ||
| 1 | . | 成员选择(对象) | 左到右 | ||
| 1 | -> | 成员选择(指针) | 左到右 | ||
| 2 | - | 负号运算符 | 右到左 | 单目运算符 | |
| 2 | (类型) | 强制类型转换 | 右到左 | ||
| 2 | ++ | 前置自增运算符 | 右到左 | 单目运算符 | |
| 2 | ++ | 后置自增运算符 | 右到左 | 单目运算符 | |
| 2 | -- | 前置自减运算符 | 右到左 | 单目运算符 | |
| 2 | -- | 后置自减运算符 | 右到左 | 单目运算符 | |
| 2 | * | 取值运算符 | 右到左 | 单目运算符 | |
| 2 | & | 取地址运算符 | 右到左 | 单目运算符 | |
| 2 | ! | 逻辑非运算符 | 右到左 | 单目运算符 | |
| 2 | ~ | 按位取反运算符 | 右到左 | 单目运算符 | |
| 2 | sizeof | 长度运算符 | sizeof(表达式) | 右到左 | |
| 3 | / | 除 | 左到右 | 双目运算符 | |
| 3 | * | 乘 | 左到右 | 双目运算符 | |
| 3 | % | 取模 | 左到右 | 双目运算符 | |
| 4 | + | 加 | 左到右 | 双目运算符 | |
| 4 | - | 减 | 左到右 | 双目运算符 | |
| 5 | << | 左移 | 左到右 | 双目运算符 | |
| 5 | >> | 右移 | 左到右 | 双目运算符 | |
| 6 | > | 大于 | 左到右 | 双目运算符 | |
| 6 | >= | 大于等于 | 左到右 | 双目运算符 | |
| 6 | < | 小于 | 左到右 | 双目运算符 | |
| 6 | <= | 小于等于 | 左到右 | 双目运算符 | |
| 7 | == | 等于 | 左到右 | 双目运算符 | |
| 7 | != | 不等于 | 左到右 | 双目运算符 | |
| 8 | & | 按位与 | 左到右 | 双目运算符 | |
| 9 | ^ | 按位异或 | 左到右 | 双目运算符 | |
| 10 | | | 按位或 | 左到右 | 双目运算符 | |
| 11 | && | 逻辑与 | 左到右 | 双目运算符 | |
| 12 | || | 逻辑或 | 左到右 | 双目运算符 | |
| 13 | ?: | 条件运算符 | 表达式1? 表达式2: 表达式3 | 右到左 | 三目运算符 |
| 14 | = | 赋值运算符 | 右到左 | ||
| 14 | /= | 除后赋值 | 右到左 | ||
| 14 | *= | 乘后赋值 | 右到左 | ||
| 14 | %= | 取模后赋值 | 右到左 | ||
| 14 | += | 加后赋值 | 右到左 | ||
| 14 | -= | 减后赋值 | 右到左 | ||
| 14 | <<= | 左移后赋值 | 右到左 | ||
| 14 | >>= | 右移后赋值 | 右到左 | ||
| 14 | &= | 按位与后赋值 | 右到左 | ||
| 14 | ^= | 按位异或后赋值 | 右到左 | ||
| 14 | = | 按位或后赋值变量 | 右到左 | ||
| 15 | , | 逗号运算符 | 表达式,表达式,… | 左到右 | 从左向右顺序运算 |
类型转换
由小到大
- 有符号-->有符号, 数值不变
- 有符号-->无符号, 前面补0,数值变为无符号;
- 无符号-->无符号, 数值不变
- 无符号-->有符号,数值不变
由大到小
- 有符号-->有符号,丢掉高位多余字节,剩余按补码形式求数值
- 有符号-->无符号,丢掉高位多余直接,剩余按原码表示数值
- 无符号-->有符号,丢掉高位多余字节,剩余按补码形式求数值
- 无符号-->无符号,丢掉高位多余直接,剩余按原码表示数值
溢出
浮点数上溢 infinity 无穷大
浮点数下溢 NaN, not a number
移位
- 无符号数左移右移均补0
- 有符号左移补0;右移补1
const
以const关键字申明的对象,其值不能通过赋值,递增或者递减修改
c
int const *p; // p指向const类型的int变量
const int *p; // p指向const类型的int变量
int *const p; // p是const类型的指针,p的值不能改,必须指向同一个地址static
修饰函数时,函数具有文件作用域
修饰全局变量时,变量具有文件作用域
修饰局部变量时,该变量存在data段
volatile
告知编译器,该变量可能会发生变化,编译器不能优化该变量的存储空间
常用来修饰寄存器变量,或者IO变量,或多线程共享变量
printf
| 转换说明 | 输出 |
|---|---|
| %a %A | 浮点数 十六进制数 |
| %c | 单个字符 |
| %d %i | 有符号十进制整数 |
| %e %E | 浮点数 e记数法 |
| %f | 浮点数 十进制记数法 |
| %g %G | 根据值的不用自动选择%f或%e |
| %o | 无符号八进制整数 |
| %p | 指针 |
| %s | 字符串 |
| %u | 无符号十进制整数 |
| %x %X | 无符号十六进制整数 |
| %% | 打印一个百分号 |
| 修饰符 | 含义 |
|---|---|
| 标记 | - + 空格 # 0 用法见下表 |
| 数字 | 最小字段宽度 |
| .数字 | 精度 |
| h | 和整型一起使用,表示short int或unsigned int short |
| hh | 和整型一起使用,表示signed char或unsinged char |
| j | 和整型一起使用,表示intmax_t或uintmax_t |
| l | 和整型一起使用,表示long int或unsigned long int |
| ll | 和整形一起使用,表示long long int或unsigned long long int |
| L | 和浮点转换一起使用,表示long double类型的值 |
| t | 和整形转换说明一起使用,表示ptrdiff_t类型的值 |
| z | 和整形转换说明一起使用,表示size_t类型的值 |
| 标记 | 含义 |
|---|---|
| - | 待打印项左对齐 |
| + | 在符号数前面加上正负号 |
| 空格 | 若有符号值为正,则在值前面显示前导空格;如值为负数,则在前面显示减号 |
| # | 把结果转换为另一种形式。如果是%o格式,则以0开始;若是%x格式,则以0X开始 |
| 0 | 对于数值格式,用前导0代替空格填充字段宽度 |
#define中使用参数
c
//#宏创建字符串
#define TEST(x) printf(#x "is %d\n", x)
//##预处理粘合剂
#define NAME(x) NAME_##x
//变参宏
#define PRINT(...) printf(__VA_ARGS__)