1、运算符
除了赋值运算和自增自减运算之外,任何表达式都不会影响原操作数的值。
单目运算: 操作数只有一个
双目运算: 操作数有两个
三目运算: 操作数有三个
在同一个表达式中出现两个以上的运算符则成为复合运算。 在复合表达式中要分清优先级,优先级搞的要先运算。
例如:a = b + c * d
遇到同级有优先级要看结核性。
例如: a + b - c ; a = b = c
单目运算(后缀++ 和后缀--除外)、三目运算、赋值运算都是右结合性,要优先计算右操作数。
2、类型转换
C语言的类型转换分为两种,隐式转换
和 显示转换
其中基本类型(int/short/char/float)可以自动隐式转换,复杂类型(*/struct)需要强制转换
有符号数和无符号数间:编译器先讲所有的有符号数隐式转换为无符号数,结果为无符号数。
例如:
int a = -20;
unsigned int b = 10;
if(a < b)
puts("YES");
else
puts("NO");
以上结果打印:NO
不同宽度的整数间:编译器会先讲所有的类型隐式转换为两者间宽度更大的类型。
例如:
char short short
int char int
short int int
浮点数和整数间:编译器会先讲所有的类型转换为浮点数运算,表达式的结果为浮点数。
例如:
int float float
char float float
float short float
int doulue double
单精度和双精度浮点间:编译器会先讲所有的类型转换为双精度浮点并运算,表达式的结果为双精度浮点数。
例如:
float double double
double float double
总结以上规律: 宽度不同结果向宽扩展,遇到浮点结果为浮点。
- 布尔型和其他类型的转换:任何类型都可以隐式转换为布尔类型,此时非0为真,0为假。布尔类型可以隐式转换为整数型:真为1,假为0
3、算术运算
用来进行常规计算,包含加,减,乘,除,取模(取余),自增,自减: + - * / % ++ --
注意:
前缀++或前缀--的运算方法是先运算后取值 例如: int i = 10; ++i 表达式的结果为11
后缀++或后缀--的运算方法是先取值后运算 例如:int i = 10; i++ 表达式的结果是10,但是运算完之后变量i的值为11
4、逻辑运算
逻辑运算用来测试一个表达式结果的真假:&& || !
逻辑运算的结果是布尔值(逻辑值),只有真假两种结果。
- 真值表:
与:&&
真 假 假
真 真 真
假 真 假
假 假 假
或:||
真 真 真
真 假 真
假 真 真
假 假 假
非:!
真 假
假 真
短路特性:在与或运算中,如果左边表达式的结果已经能够决定整个与或运算的结果时,则右边表达不再执行。
例如:
int a = 10;
int b = 20;
if(a > 0 || a += 10) //因为a > 0 为真,能够决定整个表达式的结果,a+=10不执行
if(b <= a && b++) //因为b <= a 为假,能决定整个表达式的结果,所以b++不执行
if(a > 5 && a++) //因为a > 5为真,不能决定整个表达式,所以 a++ 执行
5、关系运算
用来进行数值比较:> >= < <= == !=
注意:
关系运算的结果值是布尔值(逻辑值),只有真假两种结果。
等于运算是 == ,>= <= == != 这些运算符都是两个符号,中间不能有间隔
6、位运算
用来进行位操作,可以通过运算操作数据中某一位:| ~ ^ << >>
位与:参照逻辑运算的真值表
6 110 &
5 101
--------
4 100
位或:操作逻辑运算的真值表
18 10010 |
15 01111
--------
31 11111
异或:^相同为0, 不同为1
1010101
0100111
-----------
1110010
左移:符号位布标,整体左移,高位移出,低位补0
1010110 <<2
1011000
7、赋值运算
用来改变一个变量的值,表达式的结果取最左值: += -= *= /= %= <<= >>= |= &= ^=
8、三目运算
可以用来对分支语句进行简单替代
if(a > b)
max = a;
else
max = b;
替换为: max = a > b ? a : b;
9、逗号表达式
使用 ,
符号间隔子语句,表达式的结果取最右值
例如:
ret = (a = 10, b = 20, c = 30);
ret 的值为30,注意上述表达式的优先级,因为逗号比赋值的优先级低,要用括号括起来。
10、其他符号
[] -> . & *