掌握 C 语言流程控制:分支、循环、goto 与表达式求值详解

分支结构

if ... else if ... else 语句

  1. 条件判断中禁止使用赋值运算符,若需赋值先在分支外执行(避免副作用)
  2. 判断语句不支持连续比较,必须用逻辑符号拆分(等于判断时常量建议写左侧)
  3. 分支的 else if 和 else 永远与最近未匹配的 if 绑定(避免根据视觉缩进判断)
c 复制代码
#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 语句

  1. 每个 case 执行体结束后必须加 break(除非明确需穿透)
  2. 加 break 的 default 分支位置不影响执行效果(建议放在末尾)
  3. case 标签必须是整型常量表达式,比较时会将 switch 表达式转换
  4. 内层 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 语句

  1. 短路特性:若已能确定整个逻辑表达式结果,剩余表达式将跳过
  2. 编写程序的常见错误:编译型错误、链接型错误、运行时错误
  3. 逗号表达式的子表达式从左到右依次执行,返回最后子表达式结果
c 复制代码
#include <stdio.h>

int main()
{
    int i = 15;
    
    // 一个表达式中不能多次修改同一个变量(两个序列点之间)
    while (i-- || i++)
    {
	    // 函数实参求值顺序在 C 中是未指定的(UB)
        printf("%d %d", i--, i++);
    }
    
    return 0;
}

do ... while 语句

  1. 该循环至少会执行一次,是先执行再判断条件的(一般不使用该循环)
  2. 要注意 break(退出当前循环)和 continue(跳到循环判断)的判断情况
  3. 在循环体中,不要多次修改判断条件的核心变量(保证逻辑清晰)
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 语句

  1. 比较不同循环的三个部分(初始化、判断、调整),for 循环的三部分更好控制
  2. 该循环可省略初始化、判断、调整中的任意部分,但省略后易导致逻辑混乱
  3. 数组越界访问属于未定义行为,程序也有可能看似正常运行(不一定崩溃)
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;
}

无条件跳转

  1. 标签需与跳转在同一函数内,该语句不能跨函数跳转
  2. 跳转时需注意申请的资源管理,避免资源未释放导致内存泄漏
  3. 同一函数内标签不能重名,跳转可能导致代码可读性变差(更易错)
  4. 仅允许用于跳出多层循环或统一错误处理,禁止用于跨代码块的随意跳转
c 复制代码
#include <stdio.h>

int main()
{
	// 需避免跳过定义与初始化(UB)
    goto LABEL;
    int x = 10;
    
LABEL:
    printf("%d\n", x);
    
    return 0;
}

表达式计算

  1. 优先级指的是,如果⼀个表达式包含多个运算符,哪个运算符应该优先执行
  2. 结合性用于确定优先级相同的运算符的执行,左结合是从左到右执行(右结合反之)
  3. 整型提升与整数转换:有符号高位补原符号位,无符号高位补零(保提升后数值不变)
  4. 不应该写出特别复杂的表达式(可能不能通过操作符的属性确定唯⼀的计算路径)
  5. 函数调用的先后顺序是无法通过操作符的优先级确定的(由编译器实现决定)
  6. 相关文档:C Operator Precedence

相关推荐
iAkuya12 分钟前
(leetcode)力扣100 62N皇后问题 (普通回溯(使用set存储),位运算回溯)
算法·leetcode·职场和发展
近津薪荼12 分钟前
dfs专题5——(二叉搜索树中第 K 小的元素)
c++·学习·算法·深度优先
xiaoye-duck14 分钟前
吃透 C++ STL list:从基础使用到特性对比,解锁链表容器高效用法
c++·算法·stl
松☆18 分钟前
CANN与大模型推理:在边缘端高效运行7B参数语言模型的实践指南
人工智能·算法·语言模型
java干货28 分钟前
为什么 “File 10“ 排在 “File 2“ 前面?解决文件名排序的终极算法:自然排序
开发语言·python·算法
_F_y28 分钟前
C语言重点知识总结(含KMP详细讲解)
c语言·开发语言
毕设源码-郭学长30 分钟前
【开题答辩全过程】以 基于python的二手房数据分析与可视化为例,包含答辩的问题和答案
开发语言·python·数据分析
皮皮哎哟36 分钟前
数据结构:嵌入式常用排序与查找算法精讲
数据结构·算法·排序算法·二分查找·快速排序
程序员清洒1 小时前
CANN模型剪枝:从敏感度感知到硬件稀疏加速的全链路压缩实战
算法·机器学习·剪枝
无小道1 小时前
Qt——常用控件
开发语言·qt