欢迎光临
我们一直在努力

分支与循环(上)

一.if语句

1.单分支

语法形式:

if(条件)
{
//要执行的代码
……
}

逻辑:如果……就……

如果条件判定为真则成立,就运行代码;不成立就直接跳过。

例如:

#include <stdio.h>
int main()
{
int score = 85; // 定义一个变量
if (score >= 60)
{
// 1. 括号内是“判定区”:计算 score >= 60 是否成立
// 2. 在 C 语言中,成立返回 1 (真),不成立返回 0 (假)
printf("成绩合格!\\n");
// 3. 只有当判定为“真”时,才会执行这里的代码
}
// 4. 无论上面是否执行,程序都会汇合到这里继续运行
return 0;
}

2.else语句

在 C 语言中,else 语句不能独立存在,它必须紧跟在 if 语句的后面。它的作用是为程序提供一个“备选方案”。

语法形式:

if (表达式)
{
// 语句块 1

}
else
{
// 语句块 2

}

逻辑:if 是“如果条件成立就做某事”,那么 else 就是“否则(如果不成立)就做另一件事”。

例如:

#include <stdio.h>

int main()
{
int score = 55;
if (score >= 60)
{
// 如果条件 (score >= 60) 为真,执行这里
printf("及格了!\\n");
}
else
{
// 如果条件 (score >= 60) 为假,执行这里
// else 后面不需要写括号和条件,它代表所有“剩下的情况”
printf("不及格,请继续努力。\\n");
}
return 0;
}

3.else if语句

当有三个或更多 的可能性需要判断时,单靠 if 和 else 就不够了。这时就需要用到 else if。

逻辑是:“如果 A 成立就做 A;否则如果 B 成立就做 B;如果都不成立就做最后的 C”。

例如:

#include <stdio.h>
int main()
{
int score = 85;
if (score >= 90)
{
// 条件 1:如果分数大于等于 90
printf("优秀\\n");
}
else if (score >= 60)
{
// 条件 2:如果不满足 90,但满足大于等于 60
// 只有上面的 if 失败了,才会来检查这个 else if
printf("及格\\n");
}
else
{
// 备选方案:如果上面的条件全部失败
printf("不及格\\n");
}
return 0;
}

4.if嵌套

if嵌套是指在一个 if 或 else 的代码块内部,又包含了另一个 if 语句。它用于处理多层前提条件的情况。

语法形式:

if (外层条件)
{
// 只有外层条件成立,才会进入这里
if (内层条件)
{
// 只有内外两层条件都成立,才会执行这里
}
}

例子:

#include <stdio.h>
int main()
{
int a = 1; // 1是,0不是
int b = 1;
if (a == 1)
{ // 第一层:先看性别
if (b == 1)
{
//第二层:如果是男生,再看脸
printf("是个帅哥");
}
}
return 0;
}

5.易错点

<1>.if 括号后面加了个分号 ;无分号

<2>.==(判断相等)写成了 =(赋值),应该为==。

<3>.多条语句,无大括号,当为单条语句时可以无大括号,多条语句加上大括号,但是if 嵌套为悬空匹配时,不写大括号 {},导致 else 找错了“对象”,所以建议无论是否为单条语句,都加上大括号。

例如:

#include <stdio.h>
int main()
{
int a = 0; // 0 表示没票
int b = 1;
if (a == 1) // 外层 if
if (b == 1) // 内层 if
printf("有座票,请坐下。");
else // 这里的缩进骗了你的眼睛!
printf("没票请去买票。");
return 0;
}

此时谁也不打印。

逻辑:else 和第一个 if 对齐了,但编译器根本不看缩进,这个 else 离 if (isSeat == 1) 最近,所以它们两个是一伙的,所以第一个if不满足条件,也就不进入嵌套中。

二.三目操作符与短路

1.三目操作符

代码块:条件 ? 表达式1 : 表达式2 ;唯一一个需要三个操作数的运算符,语法形式比较精炼。

逻辑:先看“条件”,

如果为真(非 0),整个式子的值就是 表达式 1。

如果为假(等于 0),整个式子的值就是 表达式 2。

例子:

#include <stdio.h>
int main()
{
int a = 10;
int b = 20;
// 逻辑:a 大于 b 吗?是的话取 a,否则取 b。
int max = (a > b) ? a : b;
printf("较大的数是:%d\\n", max);
return 0;
}

易错点:优先级的问题,三目操作符的优先级较低,表达式里做了加减乘除。

2.短路

短路 是逻辑运算符 &&(逻辑与)和 ||(逻辑或)的一个非常重要且“聪明”的特性。

<1>.&&(逻辑与)短路

逻辑:对于 A && B,只有 A 和 B 都是真,结果才是真,如果 A 是假 (0),那么无论 B 是什么,整个式子肯定都是假,结果此时编译器会直接跳过 B,不再运行 B 部分的代码。

例如:

#include<stdio.h>
int main()
{
int a = 0;
int b = 10;
// 由于 a == 1 为假,发生短路,后面的 (b++) 根本不会执行!
if (a == 1 && b++ > 5)
{
printf("这里进不来\\n");
}
printf("b 的值是: %d\\n", b); // 结果仍然是 10,而不是 11
return 0;
}

<2>.|| (逻辑或) 的短路

逻辑:对于 A || B,只要有一个是真,结果就是真。如果 A 是真 (非 0),那么无论 B 是什么,整个式子肯定都是真,此时编译器会直接跳过 B,不再运行 B 部分的代码。

例如:

#include<stdio.h>
int main()
{
int a = 1;
int b = 10;
// 由于 a == 1 为真,发生短路,整个式子已经成立了,后面的 (b++) 被直接无视
if (a == 1 || b++ > 5)
{
printf("这里能进来\\n");
}
printf("b 的值是: %d\\n", b); // 结果仍然是 10,而不是 11
return 0;
}

3.避坑指南:

<1>.保持纯粹:尽量不要在 if 的括号里写类似 i++ 或修改变量的操。

<2>.顺序至上:把最容易判定失败的条件放 && 左边;把最容易判定成功的条件放 || 左边。

<3>.安全检查:利用短路做“安全过滤”。

三.switch语句

特点:特殊的if…else结构。

语法形式:

switch(expression) //表示的结果必须为整型,字符类型也是整型
{
case value: //case后的值必须为整型或字符类型
statement //执行语句
break; //跳出开关

/* 可以有任意数量的 case */

default: //默认分支(可选)
default_statements;
}

详细解释:

1.控制表达式 (expression)

硬性规定:括号内的结果必须是整型(int, char, short 等)。

明显错误:switch (3.14) 或 switch ("hello") 会导致编译失败。

2.case 标签与常量

唯一性:每个 case 后面的常量必须是唯一的,不能重复。

必须是常量:case 1: 或 case 'A': 是合法的;但 case x:(x是变量)是非法的。

冒号:常量后面必须紧跟一个冒号 :。

3. break 语句(关键控制)

作用:执行完当前分支后,立即跳出整个 switch 大括号。

如果不写:程序会发生“穿透”(Fall-through),继续执行下一个 case 里的代码,不管条件是否满足。

4. default 标签

地位:相当于 if-else 里的最后一个 else。

作用:当所有的 case 都不匹配时,执行这里的代码。

例如:

#include <stdio.h>
int main()
{
int floor = 2;

switch (floor)
{
case 1:
printf("到达 1 楼:大厅\\n");
break;
case 2:
printf("到达 2 楼:餐厅\\n");
break;
case 3:
printf("到达 3 楼:客房\\n");
break;
default:
printf("抱歉,该楼层不存在\\n");
}
return 0;
}

下一节为循环。

赞(0)
未经允许不得转载:171主机测评 » 分支与循环(上)
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址