运算符和表达式
廖家龙 用心听,不照做

C运算符、优先级整理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
C运算符:

赋值运算符【=、+=、-=、*=、/=、%=】
算术运算符【+、-、*、/、%】
关系运算符【==、!=、>、>=、<、<=】
自增自减运算符【++、—-】
逗号运算符【,】
逻辑运算符【&&(与)、||(或)、!】
取地址运算符【&】

C优先级:
1)():从左到右
2)! + - ++ —:从右到左(单目的+和-)
3)* / %:从左到右
4)+ -:从左到右
5)< <= > >=:从左到右
6)== !=:从左到右
7)&&:从左到右
8)||:从左到右
9)= += -= *= /= %=:从右到左

运算符和表达式的一些注意点

1)逃逸字符:用来表达无法印出来的控制字符或特殊字符,它由一个反斜杠”\”开头,后面跟上另一个字符,这两个字符合起来,组成了一个字符:printf(“请分别输入身高的英尺和英寸,”“如输入\“5 7 \”表示5英尺7英寸:“);

\b:回退一格
\t:到下一个表格位
\n:换行
\r:回车
\”:双引号
\’:单引号
\:反斜杠本身

转义符只能是小写字母,每个转义符只能看作一个字符

垂直制表符“\v”和换页符“\f”对屏幕没有任何影响,但会影响打印机执行相应的操作

在C语言程序中,通常会用转义符表示不可打印的字符

2)如果参与算术表达式的操作数的类型不一致,那么这个算术表达式的结果的类型就是范围最大的那个类型

3)m % n的结果一定是在0~(n-1)之间

4)char类型的数据可以参与算术运算,当算术表达式中的操作数是一个char数据的时候,会先将这个char数据的ASCII码取出来代替,然后再参与算术运算,实际上它是一个int类型的数据在参与运算;char数据也可以参与比较运算

5)const是一个修饰符,加在int的前面,用来给这个变量加上一个const(不变的)的属性。这个const的属性表示这个变量的值一旦初始化,就不能再修改了,如果你试图对常量做修改,把它放在赋值运算符的左边,就会被编译器发现,指出为一个错误

6)无论是前自增表达式还是后自增表达式,都是将自身的值增加1

7)sizeof是一个运算符,给出某个类型或变量在内存中所占据的字节数:sizeof(int)、sizeof(i)

sizeof是静态运算符,它的结果在编译时刻就决定了,不要在sizeof的括号里做运算,这些运算不会做的

8)逻辑运算是对逻辑量进行的运算,结果只有0或1,逻辑量是关系运算或逻辑运算的结果

逻辑非!【!a,如果a是true,结果就是false,如果a是false,结果是true】
逻辑与&&【a && b,如果a和b都是true,结果就是true,否则就是false】
逻辑或||【a || b,如果a和b有一个是true,结果为true,两个都是false,结果为false】

x>4 && x<6:像4<x<6这样的式子,不是C能正确计算的式子,因为4<x的结果是一个逻辑值(0或1)

短路:逻辑运算是自左向右进行的,如果左边的结果已经能够决定结果了,就不会做右边的计算;对于&&,左边是false时就不做右边了;对于||,左边是true时就不做右边了

不要把赋值,包括复合赋值组合进表达式!a==6 && b==1;a==6 && b+=1

9)三元表达式、条件运算符(可以部分代替if else):

1
2
3
4
5
6
7
count = (count>20) ? count-10 : count+10;

if(count > 20)
count = count-10;
else
count = count+10;

10)逗号运算符:逗号用来连接两个表达式,并以其右边的表达式的值作为它的结果。逗号的优先级是所有的运算符中最低的,所以它两边的表达式会先计算;逗号的组合关系是自左向右,所以左边的表达式会先计算,而右边的表达式的值就留下来作为逗号运算的结果
for(i=0,j=10;i<j;i++,j—)

逗号表达式的目的并不是想要前面表达式的结果,而只是想要前面的表达式执行,要最后一个表达式的结果