运算符与表达式
1.优先级与结合性:
优先级决定了各个运算符程序语句的表达式中执行的顺序。当优先级相同时,计算机就开始靠运算符的结合性来决定计算顺序。当运算符为向右结合,那么就先选取最左端的运算符然后将其同该运算符的操作数用()括起来来理解;同理,当运算符为向左结合,那么就选取最右端的运算符将其同该运算符的操作数用()括起来来理解。
2.数据类型转换
1)强制转换
也称强制类型转换,直接将某数据强制转换成指定的数据类型
例:
int a;这时b 的小数部分就会被截断,得到a = 7;将b当整数使用不会改变b 的值,也称为显式转换
float b = 7.8;
a = (int)b;
2)隐式转换
数据参加运算前要进行下列转换:
char,short→int,float→double
混合运算时数据类型由低级→高级
int unsigned long double
例:
int a = 1;char型先转化为int类型,最后再转化到*double,所以最后得到的是一个double型的数。
char b = 'A';
double c = 2.0;
a + b +c = 68.000000
3.运算符与表达式
1)赋值运算符
赋值符号:=
将赋值符右边表达式的值赋给赋值符左边的一个变量。
复合的赋值运算符:(共十个)
+= , -= , *= , /= , %= ,
<<= , >>= , &= , ^= , |=
例: a += 3 等价于 a=a+3
x *= y+8 等价于 x=x*(y+8)
x %= 3 等价于 x=x%3
由赋值运算符将一个变量和一个表达式连接起来的式子。
格式为:<变量> <赋值运算符> <表达式>
赋值运算符结合率为:“自右而左”。
例:a=b=c=5 a=(b=(c=5)) a,b,c值都是5
2)关系运算符
关系运算符用于两个数值之间的比较运算。
关系运算符的结合率为:“自左而右”。
由关系运算符和操作数组成的表达式称为关系表达式。
关系表达式的值是一个逻辑型的值,即只有两个值(真和假)。
C语言是用1作为真,用0作为假。但是进行运算时,非0即认为真,0才认为假。而表达式的结果为真时,给出真值1。为假时,给出假值0。
例:int x=5;
int y=3;
int z=1;
x>y 结果为1
z>y 结果为0;
3)逻辑运算符
与:&&
或:||
非:!
例:4 && 0 || 2 的值为1
5 && !0 的值为1
4)条件运算符
条件运算符: ? : 它是一个三目运算符。
条件表达式的一般格式为:
表达式1 ? 表达式2 : 表达式3
运算过程:表达式1的结果为真(非0)时,表达式2的计算结果作为条件表达式的值;否则,取表达式3的计算结果为条件表达式的值。
例:a>b?a:b
a>b 时执行a
反之b
5)自增自减运算符
i++,++i
i--,--i
i++,i-- 后自增/减
++i,--i 先自增/减
例:
int i=1;此时a=1,b=2,i=2
a = i++;
b = ++i;
结合律:自右向左;
i+++j <=> (i++)+j //c语言贪婪法则,编译器从左向右扫描运算符,尽可能多的组合运算符
对于sizeof这个关键字来讲,在编译时会将它内部的表达式改为最终类型,而不是表达式本身
例:
int i = 10;此时输出i为依然为10;
printf("%d%d",sizeof(i++),i);
sizeof(i++) i++最终=》sizeof(int) 没有(i++)操作
所以sizeof内部不要有赋值操作