分支语句
一、算法设计三大结构
算法设计三大结构
- 顺序执行 —— 一条路走到底
- 分支语句 —— 岔路口,选择一条路
- 循环语句 —— 来回来回,执行多次

今天我们来学习分支语句
二、关键字
-
if
if (条件判断) 若满足则执行;//注意:小括号后面没有分号!! //下一行语句与 if 是否满足条件无关,都会执行; -
if - else
if (条件判断) 若满足则执行; else 否则执行;//注意:else后面不需要加小括号!! //下一行语句与 if 是否满足条件无关,都会执行; -
if - else if - ... - else
if (条件判断) 若满足则执行; else if (条件判断2) 若满足则执行; else if ...//这里可以根据需要,学多个 else if 判断执行语句 else 若以上均不满足则执行或也可以省略; //下一行语句与 if 是否满足条件无关,都会执行;
注意:
-
else是对上一句if的否定,是不需要也不能加括号的;只有if后面需要加括号; -
if-else适用于非此即彼的关系,如果不是非此即彼,只需要加if即可。像上面第3种情况,多个分支只能选择一个分支执行,如果可能有多个分支同时满足,就不能用这种结构,而用多个if语句。
如下情况,d 只可能满足其中一种,所以使用 if else if 的形式。
if (d == 1) {
// 如果执行语句中有多个分号,即多条语句,需要用大括号
} else if (d == 2) {
} else if (d == 3) {
}
下面这种情况,d 有可能同时满足,所以不能使用 if else if 结构。
if (d%2 == 0) {
}
if (d%3 == 0) {
}
关系运算符
下表显示了 C\C++ 支持的关系运算符。
C\C++ 中,0 表示为假(false);所有非0的数均为真(true)

注意:为真,即整个式子返回 1;否则返回 0。
逻辑运算符
下表显示了 C\C++ 支持的关系逻辑运算符。

短路运算1:如果 x && y 中已知 x 为假,则 y 不会执行
短路运算2:如果 x || y 中已知 x 为真,则 y 不会执行
//如果 j 的个位不是 a,则 cnt 保持不变
if (j%10==a && ++cnt==k)
printf("%d", i);
- 单变量的逻辑运算
if (a):当 \(a\) 不为 \(0\) 时,判断为真;
if (!a):当 \(a\) 为 \(0\) 时,判断为真。
- 两种或运算
- 兼容或:\(a || b\),其中 \(a\) 和 \(b\) 可同时为真;
兼容或举例:你是喜欢吃火锅,还是喜欢吃烧烤?- 排斥或:\((a && !b) || (!a && b)\),\(a\) 和 \(b\) 只能有一个为真。在 C++ 中专门有一个排斥或的运算符,称为“异或”——
^。a ^ b仅当 \(a\) 和 \(b\) 不相等时为真。
排斥或举例:你是天蝎座,还是白羊座?
- 取非运算
#include <stdio.h>
int main() {
printf("%d %d %d", 500, !500, !!500);
// 输出 500 0 1
return 0;
}
三、条件判断如何实现
- 本质上说,在C++语言中,条件判断语句其实就是一个整数值,我们只关心它是否为 0。
- 如果整数值为 0,视为假;
- 如果整数值非 0,视为真;
也就是说,5、10000、-1均视为真值,唯独 0 被视为假值。 - 做判断可以用任何表达式计算,以其计算结果为判断依据;
- 作为关系运算符,C++语言提供了“>, <, >=, <=, ==, !=”几个判断的符号。
注意:C\C++语言中,
10 <= n <= 99是错误的写法,虽然语法正确,但判断结果不正确。
会先判断 10 <= n 的结果,如果为真,则为 1;如果为假,则为 0;
接着再用这个结果去和 99 作比较,而不论是 1 还是 0,都是小于 99 的,因此,最终结果永远为 1(真值)。
在C\C++语言中永远不要这样使用关系表达式,正确的写法是:10<=n && n<=99。必须使用
&&连接两个判断。(表示“或者”的关系时,使用||运算符;表示“否定”时,使用!)逗号和 && 是不一样的!:逗号作为一个运算符,只返回最后一个逗号后面式子或变量的值,并不是返回逗号左右两边的
与关系运算的结果,也就是说,逗号运算符并不进行“与”运算!错误举例1:
if (n>=10, n<=99)只要满足n<=99就为真。错误举例2:
if (n>=10, n<=99, n%2==1)只要满足n%2==1就为真。
四、代码块
if 语句的作用范围:
(1)若
if语句后使用了大括号,则其作用域在大括号以内;
(2)若if语句后没有使用大括号,则在if后的第一个分号以内。
如果在 if 或者 else 后面要执行的语句很多,我们就可能输入多个以分号结尾的语句,那么程序会把第一句分配给 if 或 else,其余的排除在外。
例如:
#include <stdio.h>
int main() {
int a = 0, b = 0;
if (a > 1) a += 5; b += 7;
printf("%d", b);
return 0;
}
//b += 7; 这句和 if 无任何关系,始终都会执行。
那么,如果我们想要把 b += 7; 这句也放在满足 if 条件的时候执行,有两种做法:
//方法一
#include <stdio.h>
int main() {
int a = 0, b = 0;
if (a > 1) a += 5, b += 7;//把 a += 5; 的分号改成逗号,两句变成一句
printf("%d", b);
return 0;
}
//方法二
#include <stdio.h>
int main() {
int a = 0, b = 0;
if (a > 1) { a += 5; b += 7; }//用一对大括号将所有语句括起来
printf("%d", b);
return 0;
}
如同 main() 后面的大括号一样,一对大括号括起来的所有代码,被视为一个代码块,作为一个整体,如同是一句话。
- 代码块带来的生存周期问题
如果我们在大括号内声明一个变量,那么该变量的生存周期就仅在该大括号的内部(即其作用域),一旦大括号内的语句执行完毕,该变量将不复存在。
if (d == 3) {
int ans = d * 2;
}
printf("%d", ans);//编译报错,ans未声明
局部变量
在大括号内部的变量相对于外部的变量,称为局部变量。
当局部变量与外部变量同名时,局部变量会在其生存周期内覆盖外部变量。
#include <stdio.h>
int main() {
long long d = (1LL<<60);
int ans = 5;
if (d%2 == 0) {
int ans = 3;
// 改括号内部的ans覆盖了外部的ans
ans *= 5;
printf("if ans = %d\n", ans);
}
// 外部ans并未改动
printf("main ans = %d", ans);
return 0;
}
五、switch 语句
switch 的英文意思是中转或开关,通常在乘车时,中转站被称为 switch,在分支语句中,当我们明确需要一个多叉的分支时,如果每个分支恰好对应一个具体的整数值,我们就可以使用 switch 语句。
switch(op) {//op一定是一个整数类型,可以为char,int,long long等
case a: ...; break;//break语句表示从这里直接退出到switch的大括号外
case b: ...; break;
...
default: ...; break;//相当于最后一个else,就是所有其他情况
}
switch 语句等同于 if-else if-else 结构,但后者应用范围更广,当分支条件不是具体值,而是取值范围时,就只能使用 if-else if-else 结构了。
如,输入一个实数 x,输出对应的 f(x) 的值:
if (x < 0) puts("-1");
else if (x < 10) puts("3");
else puts("5");

浙公网安备 33010602011771号