#include <stdio.h>
int main()
{
int a = 1, b = 0;
if (a > 0)
if (b > 0)
printf("A");
else
printf("B");
return 0;
}
switch ... case ... default 语句
每个 case 执行体结束后必须加 break(除非明确需穿透)
加 break 的 default 分支位置不影响执行效果(建议放在末尾)
case 标签必须是整型常量表达式,比较时会将 switch 表达式转换
内层 switch 中的 break 仅跳出该 switch,不影响外层循环或 switch
c复制代码
#include <stdio.h>
int main()
{
int num = 2;
switch (num)
{
case 1:
printf("1");
default:
printf("默认");
case 2:
printf("2");
case 3:
printf("3");
}
return 0;
}
循环结构
while 语句
短路特性:若已能确定整个逻辑表达式结果,剩余表达式将跳过
编写程序的常见错误:编译型错误、链接型错误、运行时错误
逗号表达式的子表达式从左到右依次执行,返回最后子表达式结果
c复制代码
#include <stdio.h>
int main()
{
int i = 15;
// 一个表达式中不能多次修改同一个变量(两个序列点之间)
while (i-- || i++)
{
// 函数实参求值顺序在 C 中是未指定的(UB)
printf("%d %d", i--, i++);
}
return 0;
}
do ... while 语句
该循环至少会执行一次,是先执行再判断条件的(一般不使用该循环)
要注意 break(退出当前循环)和 continue(跳到循环判断)的判断情况
在循环体中,不要多次修改判断条件的核心变量(保证逻辑清晰)
c复制代码
#include <stdio.h>
int main()
{
int i = 0;
do {
i++;
if (i % 2 == 0)
{
continue;
}
printf("%d\n", i);
} while (i < 5);
return 0;
}
for 语句
比较不同循环的三个部分(初始化、判断、调整),for 循环的三部分更好控制
该循环可省略初始化、判断、调整中的任意部分,但省略后易导致逻辑混乱
数组越界访问属于未定义行为,程序也有可能看似正常运行(不一定崩溃)
c复制代码
#include <stdio.h>
int main()
{
// 越界访问(UB)
int i = 0;
int arr[10] = { 0 };
for(i = 0; i <= 12; i++)
{
arr[i] = 0;
printf("hehe");
}
return 0;
}
无条件跳转
标签需与跳转在同一函数内,该语句不能跨函数跳转
跳转时需注意申请的资源管理,避免资源未释放导致内存泄漏
同一函数内标签不能重名,跳转可能导致代码可读性变差(更易错)
仅允许用于跳出多层循环或统一错误处理,禁止用于跨代码块的随意跳转
c复制代码
#include <stdio.h>
int main()
{
// 需避免跳过定义与初始化(UB)
goto LABEL;
int x = 10;
LABEL:
printf("%d\n", x);
return 0;
}