Skip to content

要点 ​


数据表示 ​

进制表示举例
二进制后缀加b111b
八进制前缀加0012
十六进制前缀加0x或0X0xFF,0xff

运算符优先级 ​

优先级运算符名称或含义使用形式结合方向说明
1[ ]数组下标左到右
1( )函数调用左到右
1.成员选择(对象)左到右
1->成员选择(指针)左到右
2-负号运算符右到左单目运算符
2(类型)强制类型转换右到左
2++前置自增运算符右到左单目运算符
2++后置自增运算符右到左单目运算符
2--前置自减运算符右到左单目运算符
2--后置自减运算符右到左单目运算符
2*取值运算符右到左单目运算符
2&取地址运算符右到左单目运算符
2!逻辑非运算符右到左单目运算符
2~按位取反运算符右到左单目运算符
2sizeof长度运算符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__)