C语言 三
目录
运算符
运算符基础
算术运算符
关系(比较)运算符
逻辑运算符
位运算符
赋值运算符
三元运算符
流程控制
分支控制语句
赋值运算符       
6 运算符
6.1 运算符基础
**运算符:**也称为操作符,是一种特殊的符号,用以用于数据的运算、赋值和比较等。
运算数: 也称为操作数,参与运算的数据,可以是变量、常量、表达式。
表达式: 表达式具有值,可以是一个变量、一个常量,也可以是变量、常量和运算符的组合。
运算符4要素: 功能、所需操作数个数、所组成表达式的值、有无副作用。
运算符分类(按操作数个数): 一元运算符、二元运算符、三元运算符。
运算符分类(按功能): 算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符、其他运算符
6.2 算术运算符
| 运算符 | 描述 | 操作数个数 | 所组成表达式的值 | 有无副作用 | 
|---|---|---|---|---|
+ | 
正号 | 1 | 操作数的值 | 无 | 
- | 
负号 | 1 | 操作数的值符号取反 | 无 | 
+ | 
相加 | 2 | 相加的值 | 无 | 
- | 
相减 | 2 | 相减的值 | 无 | 
* | 
相乘 | 2 | 相乘的值 | 无 | 
/ | 
相除 | 2 | 相除的值 | 无 | 
% | 
取余(取模) | 2 | 余数 | 无 | 
++ | 
自增 | 1 | 有 | |
-- | 
自减 | 1 | 有 | 
总结:
- 正号、负号
 - 加、减、乘、除
 - 取余(取模)
 
- 表达式的值的符号与第一个操作数保持一致。
 - 要求两个操作数必须都是整数。
 - 自增、自减
 
- 如果操作数在前,取操作数自增自减之前的值作为表达式的值(i++/i–)
 - 如果运算符在前,取操作数自增自减之后的值作为表达式的值(++i/–i)
 
注意:
- 带有副作用的运算符,要求操作数必须是变量的形式。
 - C 语言规定,同一个表达中,不允许出现互相影响的带有副作用的子表达式(C 语言标准没有规定各个操作数的计算顺序,由编译器自行实现)。
 
6.3 关系(比较)运算符
| 运算符 | 描述 | 操作数个数 | 所组成表达式的值 | 有无副作用 | 
|---|---|---|---|---|
> | 
大于 | 2 | 1或0 | 无 | 
>= | 
大于等于 | 2 | 1或0 | 无 | 
< | 
小于 | 2 | 1或0 | 无 | 
<= | 
小于等于 | 2 | 1或0 | 无 | 
== | 
相等 | 2 | 1或0 | 无 | 
!= | 
不相等 | 2 | 1或0 | 无 | 
总结:
- 比大小
 - 判等
 
6.4 逻辑运算符
| 运算符 | 描述 | 操作数个数 | 所组成表达式的值 | 有无副作用 | 
|---|---|---|---|---|
&& | 
逻辑与 | 2 | 两个条件都成立得1,否则得0 | 无 | 
ll | 
逻辑或 | 2 | 只要一个条件成立就得1,都不成立得0 | 无 | 
! | 
逻辑非 | 1 | 操作数非0表达式得0,操作数0表达式得1 | 无 | 
注意:
逻辑与 短路:如果第一个条件不成立,第二个条件将不会执行到。
逻辑或 短路:如果第一个条件就成立,第二个条件将不会比执行。
6.5 位运算符
| 运算符 | 描述 | 操作数个数 | 所组成表达式的值 | 有无副作用 | 
|---|---|---|---|---|
& | 
按位与 | 2 | 按位相同为1,否则为0 | 无 | 
l | 
按位或 | 2 | 按位只要有一个为1,都为1 | 无 | 
^ | 
按位异或 | 2 | 按位不同为1,否则为0 | 无 | 
~ | 
按位取反 | 1 | 0变1,1变0 | 无 | 
<< | 
按位左移 | 2 | 最低位补0 | 无 | 
>> | 
按位右移 | 2 | 注意 | 无 | 
总结:
- 按位左移和右移的快捷计算方式:
 
注意:
- 对于有符号数,如果最高位为1(负数),则右移时会在最高位补1。
 
-  如果最高位为0(正数),则右移时会在最高位补0。
 
6.6 赋值运算符
| 运算符 | 描述 | 操作数个数 | 所组成表达式的值 | 有无副作用 | 
|---|---|---|---|---|
= | 
赋值 | 2 | 左边操作数的值 | 有 | 
+= | 
相加赋值 | 2 | 左边操作数的值 | 有 | 
-= | 
相减赋值 | 2 | 左边操作数的值 | 有 | 
*= | 
相乘赋值 | 2 | 左边操作数的值 | 有 | 
/= | 
相除赋值 | 2 | 左边操作数的值 | 有 | 
%= | 
取余赋值 | 2 | 左边操作数的值 | 有 | 
&= | 
按位与赋值 | 2 | 左边操作数的值 | 有 | 
l= | 
按位或赋值 | 2 | 左边操作数的值 | 有 | 
^= | 
按位异或赋值 | 2 | 左边操作数的值 | 有 | 
<<= | 
左移赋值 | 2 | 左边操作数的值 | 有 | 
>>= | 
右移赋值 | 2 | 左边操作数的值 | 有 | 
总结:
c += 3; // 等价于 c = c + 3; 计算后c的值变为33
c += b; // 等价于 c = c + b; 计算后c的值变为53
a += 1.7; // 等价于 a = a + 1.7 计算后a的值变为11
注意:
(1)赋值运算符的第一个操作数(左值)必须是变量的形式,第二个操作数可以是任何形式的表达式。
(2)赋值运算符的副作用针对第一个操作数。
6.7 三元运算符
| 运算符 | 描述 | 操作数个数 | 所组成表达式的值 | 有无副作用 | 
|---|---|---|---|---|
| 条件表达式? 表达式1: 表达式2; | 3 | 注意 | 无 | 
总结:
- a > b ? 1.1 : 1.2
 - 若a>b为1.1,若a<b为1.2
 
注意:
(1)如果条件表达式为非0(真),整个表达式的值是表达式1;
(2)如果条件表达式为0(假),整个表达式的值是表达式2;
7 流程控制
7.1 分支控制语句
① 单向分支
1  | if (条件表达式)  | 
② 双向分支
1  | if (条件表达式)  | 
③ 多向分支 else if
1  | if (条件表达式1)  | 
④ 多向分支 switch case
1  | switch (表达式)  | 
注意:
(1)switch 后面表达式的值必须是一个整型(char、short, int, long等)或 枚举类型。
(2)case 后面的值必须是字面量常量,而不能是变量、标识符常量。
(3)default 是可选的,当没有匹配的 case 时,执行 default。
(4)break 语句可以使程序跳出 switch 语句块,如果没有break,会执行下一个case 语句块,直到遇到break或者执行到switch结尾,这个现象称为穿透。
⑤ 嵌套分支
1  | if (条件表达式)  | 
.png)
.png)
.png)
.png)
.png)

.png)
.png)