分支语句

一、算法设计三大结构

算法设计三大结构

  • 顺序执行 —— 一条路走到底
  • 分支语句 —— 岔路口,选择一条路
  • 循环语句 —— 来回来回,执行多次

今天我们来学习分支语句

二、关键字

  1. if

    if (条件判断) 若满足则执行;//注意:小括号后面没有分号!!
    //下一行语句与 if 是否满足条件无关,都会执行;
    
  2. if - else

    if (条件判断) 若满足则执行;
    else 否则执行;//注意:else后面不需要加小括号!!
    //下一行语句与 if 是否满足条件无关,都会执行;
    
  3. if - else if - ... - else

    if (条件判断) 若满足则执行;
    else if (条件判断2) 若满足则执行;
    else if ...//这里可以根据需要,学多个 else if 判断执行语句
    else 若以上均不满足则执行或也可以省略;
    //下一行语句与 if 是否满足条件无关,都会执行;
    

注意

  1. else 是对上一句 if 的否定,是不需要也不能加括号的;只有 if 后面需要加括号;

  2. 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);
  1. 单变量的逻辑运算

if (a):当 \(a\) 不为 \(0\) 时,判断为真;
if (!a):当 \(a\)\(0\) 时,判断为真。

  1. 两种或运算
  • 兼容或:\(a || b\),其中 \(a\)\(b\) 可同时为真;
    兼容或举例:你是喜欢吃火锅,还是喜欢吃烧烤?
  • 排斥或:\((a && !b) || (!a && b)\)\(a\)\(b\) 只能有一个为真。在 C++ 中专门有一个排斥或的运算符,称为“异或”—— ^a ^ b 仅当 \(a\)\(b\) 不相等时为真。
    排斥或举例:你是天蝎座,还是白羊座?
  1. 取非运算
#include <stdio.h>
int main() {
	printf("%d %d %d", 500, !500, !!500);
	// 输出 500 0 1 
    return 0;
}

三、条件判断如何实现

  1. 本质上说,在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

  • 必须使用 && 连接两个判断。(表示“或者”的关系时,使用 || 运算符;表示“否定”时,使用 !

  • 逗号和 && 是不一样的!:逗号作为一个运算符,只返回最后一个逗号后面式子或变量的值,并不是返回逗号左右两边的关系运算的结果,也就是说,逗号运算符并不进行“与”运算!

    错误举例1if (n>=10, n<=99) 只要满足 n<=99 就为真。

    错误举例2if (n>=10, n<=99, n%2==1) 只要满足 n%2==1 就为真。

四、代码块

if 语句的作用范围:

(1)若 if 语句后使用了大括号,则其作用域在大括号以内;
(2)若 if 语句后没有使用大括号,则在 if 后的第一个分号以内。

如果在 if 或者 else 后面要执行的语句很多,我们就可能输入多个以分号结尾的语句,那么程序会把第一句分配给 ifelse,其余的排除在外。

例如:

#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) 的值:

\[f(x) = \left\{ \begin{aligned} &-1 &x<0 \\ &3 &0\le x\lt 10 \\ &5 &x \ge 10 \end{aligned} \right. \]

if (x < 0) puts("-1");
else if (x < 10) puts("3");
else puts("5");
posted @ 2024-03-31 08:41  飞花阁  阅读(278)  评论(0)    收藏  举报
//雪花飘落效果