嵌入式第16步——运算式和表达式
计算机程序,不论是数据计算,还是做分支、嵌套判断,都需要进行计算,计算过程就是各个计算符十一点过程。C语言的运算符包括算术运算符、关系运算符、逻辑运算符、赋值运算符。
1、运算符优先级和结合性见下表:
|
优先级 |
运算符 |
含义 |
使用形式 |
结合性 |
说明 |
|
1 |
[ ] |
数组下标 |
数组名[整形表达式] |
左到右 |
|
|
( ) |
圆括号 |
(表达式) |
|
||
|
. |
成员选择(对象) |
对象.成员名 |
|
||
|
-> |
成员选择(指针) |
对象指针->成员名 |
|
||
|
++ |
自增运算符 |
变量名++ |
单目运算符 |
||
|
-- |
自减运算符 |
变量名-- |
单目运算符 |
||
|
2 |
- |
负号运算符 |
-表达式 |
右到左 |
单目运算符 |
|
(类型) |
强制类型转换 |
(数据类型)表达式 |
单目运算符 |
||
|
++ |
自增运算符 |
++变量名 |
单目运算符 |
||
|
-- |
自减运算符 |
--变量名 |
单目运算符 |
||
|
* |
取值运算符 |
*指针表达式 |
单目运算符 |
||
|
& |
取地址运算符 |
&左值表达式 |
单目运算符 |
||
|
! |
逻辑非运算符 |
!表达式 |
单目运算符 |
||
|
~ |
按位取反运算符 |
~表达式 |
单目运算符 |
||
|
sizeof |
长度运算符 |
Sizeof 表达式 或 Sizeof(类型) |
单目运算符 |
||
|
3 |
/ |
除 |
表达式/表达式 |
左到右 |
双目运算符 |
|
* |
乘 |
表达式*表达式 |
双目运算符 |
||
|
% |
余数(取模) |
整型表达式%整型表达式 |
双目运算符 |
||
|
4 |
+ |
加 |
表达式+表达式 |
左到右 |
双目运算符 |
|
- |
减 |
表达式-表达式 |
双目运算符 |
||
|
5 |
<< |
左移 |
表达式<<表达式 |
左到右 |
双目运算符 |
|
>> |
右移 |
表达式>>表达式 |
双目运算符 |
||
|
6 |
> |
大于 |
表达式>表达式 |
左到右 |
双目运算符 |
|
>= |
大于等于 |
表达式>=表达式 |
双目运算符 |
||
|
< |
小于 |
表达式<表达式 |
双目运算符 |
||
|
<= |
小于等于 |
表达式<=表达式 |
双目运算符 |
||
|
7 |
== |
等于 |
表达式==表达式 |
左到右 |
双目运算符 |
|
!= |
不等于 |
表达式!=表达式 |
双目运算符 |
||
|
8 |
& |
按位与 |
整形表达式&整形表达式 |
左到右 |
双目运算符 |
|
9 |
^ |
按位异或 |
整形表达式^整形表达式 |
左到右 |
双目表达式 |
|
10 |
| |
按位或 |
整形表达式|整形表达式 |
左到右 |
双目表达式 |
|
11 |
&& |
逻辑与 |
表达式&&表达式 |
左到右 |
双目表达式 |
|
12 |
|| |
逻辑或 |
表达式||表达式 |
左到右 |
双目表达式 |
|
13 |
?: |
条件运算符 |
表达式1?表达式2:表达式3 |
右到左 |
三目表达式 |
|
14 |
= |
赋值运算符 |
变量=表达式 |
右到左 |
双目运算符 |
|
/= |
除后赋值 |
变量/=表达式 |
双目运算符 |
||
|
*= |
乘后赋值 |
变量*=表达式 |
双目运算符 |
||
|
%= |
取模后赋值 |
变量%=表达式 |
双目表达式 |
||
|
+= |
加后赋值 |
变量+=表达式 |
双目表达式 |
||
|
-= |
减后赋值 |
变量-=表达式 |
双目表达式 |
||
|
<<= |
左移后赋值 |
变量<<=表达式 |
双目表达式 |
||
|
>>= |
右移后赋值 |
变量>>=表达式 |
双目表达式 |
||
|
&= |
按位与后赋值 |
变量&=表达式 |
双目表达式 |
||
|
^= |
按位与或后赋值 |
变量^=表达式 |
双目表达式 |
||
|
|= |
按位或后赋值 |
变量|=表达式 |
双目表达式 |
||
|
15 |
, |
逗号运算符 |
表达式1,表达式2,表达式3. |
左到右 |
|
2、运算过程中的短路求值(用于逻辑运算,如果忽略,会有坑)
短路求值又称为最小化求值,是一种逻辑运算符的求值策略。只有当第一个操作数的值无法确定逻辑运算的结果是,才对第二个操作数进行求值。C语言对逻辑与、逻辑或进行短路求值。
简单将,如果前面已经能够确定整个逻辑得出结果了,那么就不再计算后面的运算。
例1:
int a=3,b=3;
(a=0)&&(b=5)
运行结果:
a=0,b=3
因为运算式中,当&&两侧有一个为0时,最终结果即为0。左侧a=0已经造成了逻辑与(&&)运算结果为0,那么后半部的b=5将不再运算。
例2:
int a=5,b=3;
(a=1)||(b=5);
运行结果:
a=1,b=3
因为运算式中,当||两侧有一个为1时,最终结果即为1.左侧a=1已经造成逻辑或(||)运算结果为1,那么后半部的b=5将不进行运算。

浙公网安备 33010602011771号