第 7 章 运算符
7.5 赋值运算符 ——副作用针对左操作数
1. 赋值运算符有副作用,针对左边操作数
2. 左边操作数必须是变量的形式,右边操作数可以是常量、变量、表达式
eg:c += 3; // 等价于 c = c + 3;
// 从右向左赋值
int x = num = 100;
7.6 三元运算符
a ? b: c;
表达式取值规则:
① a 成立,b 作为整个表达式的值
② a 不成立,c 作为整个表达式的值
7.7 其他运算符
, 二元运算符,表达式的值是第二个操作数的值
sizeof
&
* ——取值运算符
. ——成员选择(对象)
-> ——成员选择(指针)
7.8 运算符优先级
(56 + 89) * 2
56 + 9 - 7
int a=10;
a++ + a-- - a++ * a--
a > 10 * 2
a >= 18 && a < 60
(1)不要过多的依赖运算的优先级来控制表达式的执行顺序,这样可读性太差,尽量使用小括号来控制表达式的执行顺序。
(2)不要把一个表达式写得过于复杂,如果一个表达式过于复杂,则把它分成几步来完成。
(3)运算符优先级不用刻意地去记忆,总体上:一元运算符 > 算术运算符 > 关系运算符 > 逻辑运算符 > 三元运算符 > 赋值运算符。
特例:当给一个变量加括号赋多个值时,只把括号最右边的值赋予该变量
int res1 = (a=200,b*=5);
printf("res1=%d \n", res1); //100√
int res2 = (a=100,b=200,c=300);
printf("res2=%d \n", res2); //300√
注:添加 () 提高优先级!
第 8 章 流程控制
8.1 分支控制语句
① 单向分支
if (条件表达式)
{
语句1;
语句2;
...
语句n;
}
② 双向分支
if (条件表达式)
{
语句1;
语句2;
...
语句n;
}
else
{
语句1;
语句2;
...
语句n;
}
③ 多向分支 else if
if (条件表达式1)
{
语句1;
语句2;
...
语句n;
}
else if (条件表达式2)
{
语句1;
语句2;
...
语句n;
}
else if (条件表达式2)
{
语句1;
语句2;
...
语句n;
}
else
{
语句1;
语句2;
...
语句n;
}
④ 多向分支 switch case
switch (表达式)
{
case 表达式可能的值1:
语句1;
语句2;
...
break;
case 表达式可能的值2:
语句1;
语句2;
...
break;
case 表达式可能的值3:
语句1;
语句2;
...
break;
default:
语句1;
语句2;
...
}
注意:
(1)switch后面表达式的值必须是一个整型(char、short、int、long等)或枚举类型。
(2)case后面的值必须是字面量常量,而不能是变量。
(3)default是可选的,当没有匹配的case时,执行default。
(4)break语句可以使程序跳出switch语句块,如果没有break,会执行下一个case 语句块,直到遇到break或者执行到switch结尾,这个现象称为穿透。
⑤ 嵌套分支 (双向分支+嵌套)
if ()
{
if ()
{
}
switch ()
{
case 10:
if ()
{
}
break;
case 20:
....
}
}
else
{
}
8.2 循环控制语句
① while 循环
while (条件表达式)
{
语句1;
语句2;
...
语句n;
}
死循环:
while (1)
{
printf("How Are You!\n");
}
② do while 循环
do
{
语句1;
语句2;
...
语句n;
} while (条件表达式);
while 与 do while 的区别
注:do while 只有第一次没有经过判断直接执行循环体语句,以后每次都要经过判断!
③ for 循环
for (循环控制变量初始化; 条件表达式; 循环控制变量的变化)
{
语句1;
语句2;
...
语句n;
}
说明:
- 循环控制变量初始化只执行一次,在循环之前
- 条件表达式,每次循环语句执行前先进行条件判断,比循环体语句(大括号内部的语句)多执行一次
- 循环控制变量变化循环几次就执行几次,每次会在循环体语句后面执行