- 表达式:由运算符和操作数组成的符合C语言规范的式子
- 左值:一块内存如果能够对它进行写入操作,这块内存就称为左值
- 右值:一块内存如果能够对它进行读取操作,这块内存就称为右值
算术运算符
- +、-、*、/、% 、++、--
[ / ]:除法
- 两个整数相除,结果为整数(取整)
- Python:-3//2=-2 向负无穷取整
- C :-3/2=-1 向0取整
- 一个整数与一个浮点数进行(+-*/)运算,结果为浮点数。
- 除数不能为0
[ % ] :取余
- 对普遍语言:a % b = a - a整除b * b
- C语言中取余结果 = 两个操作数绝对值进行取余,符号与做操作数相同。
- Python:-5%3=1 因为-5%3=-5-(-5)//3*3=-5-(-2)*3=-5+6=1
- C :-5%3=-2 因为-5%3=-5-(-5)/3*3=-5-(-1)*3=-5+3=-2
- 取余运算有操作数不能为0。
[ ++ ] :自增运算符,一元运算符
- 前自增运算符:++操作数
- 先对操作数进行+1操作,再取操作数的值。
- 后自增运算符:操作数++
- 先取操作数的值,本行语句执行完后再对操作数+1
int i = 1, j = 1; printf("++i = %d\n", ++i);//2 printf("j++ = %d\n", j++);//1 printf("i = %d\n", i);//2 printf("j = %d\n", j);//2
- 自增运算符主要使用在循环中,在实际开发中,不允许在一个表达式中对一个变量多次进行自增、自减操作。
赋值运算符
- 赋值运算符:=
- 复合赋值运算符
- 算术复合运算符:+=、-=、*=、/=、%=
- 位复合运算符:&=、|=、~=、<<=、>>=、^=
关系运算符
- 在运算时: 0:表示假 非0:表示真
- 在结果中: 0:表示假 1:表示真
- >、<、>=、<=、==、!=
- 0<=a<=100 结果恒为1
逻辑运算符
- 逻辑与:&&
- 逻辑与的短路问题:当左操作数结果为假时,右操作数不执行。
- 逻辑或:||
- 逻辑或的短路问题:当左操作数结果为真时,右操作数不执行。
- 逻辑非:!
- !真 => 假
- !假 => 真
条件运算符
- 操作数1 ?操作数2:操作数3
- 判断操作数1的结果,如果为真,执行操作数2;如果为假,执行操作数3。
位运算符
- 位与:&
- 对两个操作数,按位进行与运算
- 3 & 4 => 0011 & 0100 =>0000 => 0
- 位或:|
- 对两个操作数,按位进行或运算
- 位非:~
- 对两个操作数,按位进行非运算 0->1, 1->0
- 位异或:^
- 对两个操作数按位进行异或运算
- 0 ^ 0 => 0
- 1 ^ 0 => 1
- 0 ^ 1 => 1
- 1 ^ 1 => 0
- 左移:<<
- 操作数1 << 操作数2
- 将[ 操作数1 ]整体往左移动[ 操作数2 ]位,低位补0,如果有符号数,符号位会被数据位填充。
- 2 << 1 => 4
- 对于正整数而言,相当于[ 操作数1 ]乘以2的[ 操作数2 ]次方。
- 对于负整数而言,C语言没有给出定义,结果是未定义的。
- 操作数1 << 操作数2
- 右移:>>
- 操作数1 >> 操作数2
- 将[ 操作数1 ]整体往右移动[ 操作数2 ]位。
- 4 >> 1 => 2
- 对于正整数而言,相当于[ 操作数1 ]整除2的[ 操作数2 ]次方。
- 对于负整数而言,结果是未定义的。对于大部分编译器,对于负数右移运算,符号位补1来实现负整数整除2的效果。
逗号运算符(,)
- 操作数1,操作数2
- 优先级最低的运算符,二元运算符,从左到右。
- 先执行操作数1,在执行操作数2,然后把操作数2作为整个表达式的结果。
()括号运算符
- 可以通过括号运算符更改运算符的优先级。
sizeof()运算符
- 求[操作数]数据类型占用的字节数。