一、什么是表达式?
表达式就是表达某种意思的式子。
在C语言中,表达式用运算符连接操作数的式子。
广义上讲,有;的就是语句,没有分号的就是表达式。
二、C语言中的运算符:
(1)算术运算符: 双目运算符(需要连接两个操作数),结合性:左->右
* / % + -
★注意整数/整数,其结果还是整数,若想要结果为实数,可在分子*1.0
隐式类型转换:不同数据类型之间进行运算时,其结果会转化为精度高的那个数据类型。
(无符号和有符号进行计算,结果为无符号)
%:取余运算符,在C语言中,要求两个操作数都必须为整数
5%3 2%3 -5%2 5%-2 -5%-2
(2)关系运算符: 双目运算符,左->右,表达两个式子的关系
> >= < <=
== !=
由关系运算符连接操作数组成的表达式,叫做关系表达式
关系表达式的值: 1(关系成立) 0(关系不成立)
5>4>3
==> 1>3
==> 0
(3)逻辑运算符: 表达某数理逻辑的表达式
逻辑表达式的值: 真(非0) 假(0)
★任何非0的数都表示真,但是如果表达式的结果为真时,只能是1
! (逻辑非),单目运算符,取逻辑上的反
!!(-1) ==> 1
&& (逻辑与),双目运算符,"并且",结合性 左->右
a && b && c
|| (逻辑或),双目运算符,"或", 结合性 左->右
★在C语言中,运算是"惰性运算"。如果事先知道了表达式的值,那么它就不会
去运算后面的式子啦。
eg: a && b && c
只有当a的值为真时,才有必要去判断b的值
只有a和b的值都为真时,才有必要去判断c的值
a || b || c
只有当a的值为假时,才有必要去判断b的值
只有当a和b的值都为假时,才有必要去判断c的值
(4)位运算:按bit位来进行位运算操作的运算符
~ (按位取反):单目运算符
& (按位与): 双目运算符
1 & 1 ==> 1
1 & 0 ==> 0
0 & 0 ==> 0
0 & 1 ==> 0
| (按位或): 双目运算符
1 | 1 ==> 1
1 | 0 ==> 1
0 | 1 ==> 1
0 | 0 ==> 0
^ (按位异或): 双目运算符,相同为假,不同为真
1 ^ 1 ==> 0
1 ^ 0 ==> 1
0 ^ 1 ==> 1
0 ^ 0 ==> 0
<< (左移): 双目运算符,按bit位往左边移
eg: int a = 2<<1; //4
把数值2按bit位往左边移1个bit位,
高位消失,低位补0
>> (右移): 双目运算符,按bit位往右边移
逻辑右移: 高位补0
算术右移: 高位补符号位
C语言标准中,没有规定右移是逻辑右移和算术右移,在不同的编译器和处理器中,
实现方法可能不一样。
(5)赋值运算符: 双目运算符, 右->左,优先级排倒数第二
=
eg: a = 5+3;
赋值表达式的值为赋值符号左边的值,赋值运算符的左边(左操作数)必须为"可写的地址"
5 = 3;//error
复合的赋值运算符:赋值运算符可以和算术运算符、位运算符组成复合的赋值运算符
+= : a += 5 ==> a = a+5
-= &=
*= |=
/= ^=
%= <<=
~= >>=
(6) 条件运算符 ? : 三目运算符 右->左
表达式1 ? 表达式2 : 表达式3
求值顺序: 先计算表达式1的值,如果表达式1的值为真,则整个条件表达式的值为表达式2的值,
如果表达式1的值为假,则整个条件表达式的值为表达式3的值
eg: printf("the max is %d\n",a>b?a:b);
注意:条件表达式也有惰性运算
(7) 逗号运算符: 双目运算符,优先级最低的, 左->右
表达式1 , 表达式2
求值顺序: 先求表达式1的值,再求表达式2的值,整个逗号表达式的值为表达式2的值
逗号表达式的扩展
表达式1,表达式2,表达式3,...表达式n
求值顺序: 先求表达式1,再求表达式2,...最后求表达式n的值,
整个逗号表达式的值为表达式n的值
注意: 逗号表达式要与参数列表进行区分
(8)☆指针运算符(* , &)
(9)求字节运算符(sizeof)
求字节运算符的结果只跟圆括号内是什么数据类型有关,单位为字节
sizeof(1.0) == sizeof(double)
sizeof(1.0f) == sizeof(float)
sizeof(2l) == sizeof(long)
sizeof(2u) == sizeof(unsigned int)
short s;
sizeof(s+1) == sizeof(int)
(10)☆分量运算符 (. ->)
用于求结构体变量的成员变量
a.i;
p->i;//p是结构体指针
(11)☆下标运算符 ( [] )
取数组中的元素
int a[10];
a[3] a[4]
(12)强制类型转换运算符
(数据类型)
eg: float a=3.6;
printf("%d\n",(int)a);
(13)自增、自减运算符(++,--): 单目运算符
表达式的值 执行完这个表达式后i的值
i++ i i+1
++i i+1 i+1
i-- i i-1
--i i-1 i-1
注意:(1)要避免 i=i++ 这种用法
(2)要避免在避免在一个表达式里对一个变量重复用++,可能会被编译器优化
int i=2;
(++i)+(++i)+(++i)
运算符的优先级和结合性
() [] -> . 自左向右
! ~ ++ -- +-(正负号) 自右向左 单目运算符
* / % 自左向右 算术运算符
+ -
< <= > >= 自左向右 关系运算符
== !=
& ^ | << >> 自左向右 位运算符
&& 自左向右 逻辑运算符
||
? : 自右向左 条件运算符
= += -= *= /=
%= &= |= ^= <<= >>= 自右向左 赋值运算符
, 自左向右 逗号运算符
同级优先级的运算符,实际优先级为左侧优先
表达式与运算符
最新推荐文章于 2022-09-04 17:15:34 发布