首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >操作符及分支、循环语句详解

操作符及分支、循环语句详解

作者头像
Nullmian
发布2025-12-24 15:05:01
发布2025-12-24 15:05:01
1510
举报

一、基础运算操作符

我们在这里介绍一些最基础的运算符:加、减、乘、除、取模,的基本应用


一、基础算术运算符一览表

💡 重要提示:乘法使用 * 而不是 ×,除法使用 / 而不是 ÷


二、特殊运算符详解

1. 取模运算符 %
  • 运算符 % 表示求两个整数相除的余数。
示例分析
代码语言:javascript
复制
printf("%d\n", 15 % 4);   // 输出:3
printf("%d\n", 10 % 3);   // 输出:1
printf("%d\n", -15 % 4);  // 输出:-3(符号与第一个操作数相同)
注意事项
  • 只能用于整数运算,不能用于浮点数(10.5 % 3 会导致编译错误)
  • 负数取模的结果符号与第一个操作数相同
  • 0 不能作为取模运算的除数(会导致运行时错误)

2. 整数除法 vs 浮点数除法
  • 常见困惑:为什么 8 / 5 结果是 1 而不是 1.6?
代码语言:javascript
复制
#include <stdio.h>

int main() {
    // 整数除法 - 截断小数部分
    printf("8 / 5 = %d\n", 8 / 5);        // 输出:1

    // 浮点数除法 - 保留小数部分
    printf("8.0 / 5.0 = %.1f\n", 8.0 / 5.0);  // 输出:1.6
    printf("8 / 5.0 = %.1f\n", 8 / 5.0);      // 输出:1.6
    printf("8.0 / 5 = %.1f\n", 8.0 / 5);      // 输出:1.6

    return 0;
}

黄金规则:想要得到浮点数结果,至少有一个操作数是浮点数!


三、复合赋值运算符
  • 简化变量自身参与运算并赋值给自身的表达式。

示例分析

代码语言:javascript
复制
int score = 100;

score += 10;    // 相当于 score = score + 10; → 110
score -= 5;     // 相当于 score = score - 5; → 105
score *= 2;     // 相当于 score = score * 2; → 210

四、自增/自减运算符

  • 让变量的值 增加 1减少 1 的单目操作符。
前置 vs 后置的区别
代码语言:javascript
复制
#include <stdio.h>

int main() {
    int a = 5, b = 5;

    // 前置:先增减,后使用
    printf("++a = %d\n", ++a);  // 输出:6
    printf("现在 a = %d\n", a); // 输出:6

    // 后置:先使用,后增减
    printf("b++ = %d\n", b++);  // 输出:5
    printf("现在 b = %d\n", b); // 输出:6

    return 0;
}
记忆技巧
  • ++i(前缀):先+1,后使用 → 立刻增加,马上生效
  • i++(后缀):先使用,后+1 → 等等再增加,先用旧值

⚠️ 注意:避免在同一个表达式中对同一个变量多次使用自增/自减运算符,行为可能未定义


五、优先级与结合性

基本概念
  • 优先级:决定表达式中不同运算符的执行顺序(谁先谁后)
    • 例如:数学中的"先乘除后加减"
  • 结合性:当优先级相同时,决定运算的执行方向(从左到右或从右到左)
    • 例如:赋值运算符从右到左结合 a = b = 5b = 5 然后 a = b

运算符优先级表(从高到低)
示例分析
代码语言:javascript
复制
int result = 10 + 5 * 2;      // 结果是20,不是30!(先乘后加)
int result2 = (10 + 5) * 2;   // 结果是30(括号优先)

int x = 5;
int y = ++x * 2;              // x先变成6,然后6*2=12
int z = x++ * 2;              // 先用x的值6*2=12,然后x变成7

六、实战建议

1. 多用括号明确意图
代码语言:javascript
复制
// 清晰易懂
int average = (a + b + c) / 3;

// 容易误解
int confusing = a + b + c / 3;  // 实际是 a + b + (c / 3)
2. 避免复杂表达式
代码语言:javascript
复制
// 不容易理解
int result = ++a * b-- + c / d % e;

// 推荐写法
int part1 = ++a * b--;
int part2 = c / d % e;
int result = part1 + part2;
3. 注意数据类型匹配
代码语言:javascript
复制
// 错误:整数除法
double result = 5 / 2;        // 结果是2.0而不是2.5

// 正确:浮点数除法  
double correct = 5.0 / 2;     // 结果是2.5

🎯 记住:编程中的算术规则与数学基本相同,但要注意数据类型的影响!多练习,慢慢就会熟练起来。


二、关系、逻辑操作符与分支、循环语句


一、结构化程序设计基础

C语言是结构化的程序设计语言,程序结构分为三种基本类型:

  • 顺序结构:代码按顺序逐行执行
  • 选择结构:根据条件选择执行不同的代码块
  • 循环结构:重复执行某段代码直到条件不满足

💡 日常生活中几乎所有任务都可以分解为这三种结构的组合。


二、分支语句:if-else语句

1.if 语句

if语句的基本形式

代码语言:javascript
复制
if (表达式) 
{
    语句;
}
基本概念:
  • 如果表达式成立(为真),则执行语句,否则不执行。
  • 真假判断:在C语言中,0表示假,非0表示真。
示例:输入一个整数,判断是否为奇数
代码语言:javascript
复制
#include <stdio.h>

int main() 
{
    int num = 0; scanf("%d", &num);

    if (num % 2 == 1) 
    {
        printf("%d是奇数\n", num);
    }

    return 0;
}

2. if-else 语句
  • 如果⼀个数不是奇数,那就是偶数了,如果任意⼀个整数,我们要清楚的判断是奇数还是偶数怎么表示呢?
if-else语句的基本形式
代码语言:javascript
复制
if (表达式) 
{
    语句1;
} 
else 
{
    语句2;
}
示例:判断奇偶数
代码语言:javascript
复制
#include <stdio.h>

int main() 
{
    int num = 0; scanf("%d", &num);

    if (num % 2 == 1)
    {
        printf("%d是奇数\n", num);
    } 
    else 
    {
        printf("%d是偶数\n", num);
    }

    return 0;
}
练习:输入年龄判断是否成年
代码语言:javascript
复制
#include <stdio.h>

int main() 
{
    printf("请输入年龄: ");

    int age = 0; scanf("%d", &age);

    if (age >= 18) 
    {
        printf("成年\n");
    } 
    else 
    {
        printf("未成年\n");
    }

    return 0;
}

3. 分支中包含多条语句
  • 重要规则ifelse默认只控制紧随其后的一条语句。
错误示例
代码语言:javascript
复制
#include <stdio.h>

int main() 
{
    int age = 0; scanf("%d", &age);

    if (age >= 18)
        printf("成年了\n");  // 只有这条语句受if控制
        printf("可以谈恋爱了\n");  // 这条语句总是会执行

    return 0;
}
正确写法:使用大括号{}创建代码块
代码语言:javascript
复制
#include <stdio.h>

int main() 
{
    int age = 0; scanf("%d", &age);

    if (age >= 18) //if 后使⽤ {} 控制多条语句 ---- 这个块也叫:"代码块,或者复合语句"
    {
        printf("成年了\n");
        printf("可以谈恋爱了\n");
    } 
    else //else 后使⽤ {} 控制多条语句(同理)
    {
        printf("未成年\n");
        printf("好好学习\n");
    }

    return 0;
}

三、嵌套分支语句
  • if-else 语句中, else 可以与另⼀个 if 语句连用,构成多重判断。
1. 利用多重判断if-else-if-else构成嵌套结构
代码语言:javascript
复制
//⽐如:要求输⼊⼀个整数,判断输⼊的整数是0,还是正数或者负数。请看如下代码:
#include <stdio.h>

int main() {
    int num = 0;
    scanf("%d", &num);

    if (num == 0) {
        printf("输入的数字是0\n");
    } else if (num > 0) {
        printf("输入的数字是正数\n");
    } else {
        printf("输入的数字是负数\n");
    }

    return 0;
}
2.利用{}构成嵌套结构:
代码语言:javascript
复制
//⽐如:输⼊⼀个整数,如果是正数,再判断是奇数还是偶数,并输出;如果不是正数则输出:⾮正数
#include <stdio.h>
int main()
{
    int num = 0; scanf("%d", &num);

    if(num>0)
    {
        if(num%2 == 0)
          printf("偶数\n");
        else
          printf("奇数\n");
    }
    else
    {
      printf("⾮正数\n");
    }

    return 0;
}

👍 建议:使用大括号明确代码块范围,使逻辑更加清晰

2. 年龄分段判断练习
代码语言:javascript
复制
#include <stdio.h>

int main() 
{
    printf("请输入年龄: ");

    int age = 0; scanf("%d", &age);

    if (age < 18) {
        printf("少年\n");
    } else if (age >= 18 && age <= 44) {
        printf("青年\n");
    } else if (age >= 45 && age <= 59) {
        printf("中老年\n");
    } else if (age >= 60 && age <= 89) {
        printf("老年\n");
    } else {
        printf("老寿星\n");
    }

    return 0;
}

以上就是嵌套if语句的语法,有了嵌套if语句,就可以完成更多复杂逻辑的判断。


四、悬空else问题

如果有多个 ifelse ,可以记住这样⼀条规则: else 总是跟最接近的if 匹配。

1. 问题示例
代码语言:javascript
复制
#include <stdio.h>

int main() 
{
    int a = 0;
    int b = 2;

    if (a == 1)
        if (b == 2)
            printf("hehe\n");
    else
      printf("haha\n");  // 这个else与内层if匹配

    return 0;
}
  • 运行结果:什么都不输出(因为 a==1 不成立,内层if-else不会执行)

2.规范写法:

  • 统一缩进
代码语言:javascript
复制
#include <stdio.h>

int main() 
{
    int a = 0;
    int b = 2;

    if (a == 1)
        if (b == 2)
            printf("hehe\n");
        else
            printf("haha\n");  // 这个else与内层if匹配,所以和内层if缩进统一

    return 0;
}

👍建议:为了能更好的分辨ifelse的匹配关系,我们可以统一ifelse缩进

  • 使用大括号明确匹配关系
代码语言:javascript
复制
#include <stdio.h>

int main() {
    int a = 0;
    int b = 2;

    // 明确else与第一个if匹配
    if (a == 1) 
    {
        if (b == 2) 
        {
            printf("hehe\n");
        }
    } 
    else 
    {
        printf("haha\n");  // 现在会输出"haha"
    }

    return 0;
}

最佳实践:始终使用大括号,即使只有一条语句!


五、条件操作符:

条件操作符是C语言中唯一的三目运算符,其基本形式为

代码语言:javascript
复制
表达式1 ? 表达式2 : 表达式3
执行过程
  1. 先计算表达式1的值
  2. 如果表达式1为真,则整个表达式的结果为表达式2的值
  3. 如果表达式1为假,则整个表达式的结果为表达式3的值
示例
代码语言:javascript
复制
#include <stdio.h>

int main() 
{
    int a = 10, b = 20;

    // 使用条件操作符求最大值
    int max = (a > b) ? a : b;
    printf("最大值: %d\n", max);

    // 判断奇偶数
    int num = 15;
    printf("%d是%s\n", num, (num % 2 == 0) ? "偶数" : "奇数");

    // 成绩等级判断
    int score = 85;
    char grade = (score >= 90) ? 'A' : 
                 (score >= 80) ? 'B' : 
                 (score >= 70) ? 'C' : 
                 (score >= 60) ? 'D' : 'F';
    printf("成绩等级: %c\n", grade);

    return 0;
}
优点
  • 代码简洁
  • 可以用于赋值语句中
  • 在某些情况下可提高代码可读性
缺点
  • 嵌套过多时会降低可读性
  • 不适合复杂的逻辑判断
练习:使用条件操作符表示下面代码的逻辑
代码语言:javascript
复制
#include <stdio.h>
int main()
{
    int a = 0;
    int b = 0;
    scanf("%d", &a);

    if (a > 5)
      b = 3;
    else
      b = -3;

    printf("%d\n", b);

    return 0;
}


//改造后:
#include <stdio.h>
int main()
{
    int a = 0;
    int b = 0;
    scanf("%d", &a);

    b = (a > 5) ? 3 : -3;

    printf("%d\n", b);

    return 0;
}

六、switch语句

switch语句用于多分支选择,比多重if-else结构更清晰、易读

基本形式
代码语言:javascript
复制
switch (表达式) 
{
    case 常量1:
        语句1;
        break;
    case 常量2:
        语句2;
        break;
    // 更多case语句...
    default:
        默认语句;
        break;
}
执行过程
  1. 先计算switch后面的表达式值
  2. 将表达式值与各个case的常量值进行比较
  3. 找到匹配的case后,执行对应的语句
  4. 遇到break语句则跳出整个switch结构
  5. 如果没有匹配的case,则执行default语句(如果存在)

if语句和switch语句的对比

1.使用if-else实现

代码语言:javascript
复制
#include <stdio.h>

int main()
{
    int n = 0;
    scanf("%d", &n);

    if(n % 3 == 0)
        printf("整除,余数为0\n");
    else if(n % 3 == 1)
        printf("余数是1\n");
    else
        printf("余数是2\n");

    return 0;
}

2.使用switch实现

代码语言:javascript
复制
#include <stdio.h>

int main()
{
    int n = 0;
    scanf("%d", &n);

    switch(n % 3)
    {
    case 0:
        printf("整除,余数为0\n"); 
        break;
    case 1:
        printf("余数是1\n"); 
        break;
    case 2:
        printf("余数是2\n"); 
        break;
    }

    return 0;
}代码格式注意事项:
注意事项
  • switch 后的表达式必须是整型表达式(int, char, enum等)
  • case 后的值必须是整型常量表达式,不能是变量或非常量表达式
  • case 和后边的数字之间必须有空格
  • 每一个 case 语句中的代码执行完成后,需要加上 break,才能跳出这个switch语句
  • switch语句不能用于判断范围是否匹配,只能用来判断特定值是否匹配

switch语句中的break

break语句在switch中非常重要,它能实现真正的分支效果。如果没有break,会出现"case穿透"现象。

case穿透示例

代码语言:javascript
复制
#include <stdio.h>

int main()
{
    int day = 3;

    switch(day)
    {
    case 1:
        printf("星期一\n");
        // 没有break,会继续执行下一个case
    case 2:
        printf("星期二\n");
        // 没有break,会继续执行下一个case
    case 3:
        printf("星期三\n");
        // 没有break,会继续执行下一个case
    case 4:
        printf("星期四\n");
        // 没有break,会继续执行下一个case
    case 5:
        printf("星期五\n");
        break; // 这里有break,会跳出switch
    case 6:
        printf("星期六\n");
        break;
    case 7:
        printf("星期日\n"); 
        break;
    }

    return 0;
}

输出结果

代码语言:javascript
复制
星期三
星期四
星期五

合理利用case穿透

代码语言:javascript
复制
#include <stdio.h>

int main()
{
    int day = 0;
    scanf("%d", &day);

    switch(day)
    {
    case 1:
    case 2:
    case 3:
    case 4:
    case 5:
        printf("工作日\n");
        break;
    case 6:
    case 7:
        printf("休息日\n");
        break;
    }

    return 0;
}

有时我们可以故意省略break来实现多个case共享同一段代码


switch语句中的default

当switch后的表达式值与所有case都不匹配时,可以使用default子句处理这种情况。

代码语言:javascript
复制
#include <stdio.h>

int main()
{
    int day = 0;
    scanf("%d", &day);

    switch(day)
    {
    case 1:
    case 2:
    case 3:
    case 4:
    case 5:
        printf("工作日\n");
        break;
    case 6:
    case 7:
        printf("休息日\n");
        break;
    default:
        printf("输入错误,请输入1-7之间的数字\n");
        break;
    }

    return 0;
}

case和default的顺序问题

在switch语句中,case语句和default语句没有严格的顺序要求,可以根据实际需求安排。

代码语言:javascript
复制
#include <stdio.h>

int main()
{
    int score = 85;

    switch(score / 10)
    {
    default:  // default可以放在前面
        printf("不及格\n");
        break;
    case 6:
        printf("及格\n");
        break;
    case 7:
        printf("中等\n");
        break;
    case 8:
        printf("良好\n");
        break;
    case 9:
    case 10:  // case 9和10共享同一段代码
        printf("优秀\n");
        break;
    }

    return 0;
}

虽然语法上允许default放在任何位置,但通常我们把它放在最后,这样代码更易读。


三、关系、逻辑操作符

学习了这两个操作符我们就能构建更加复杂的逻辑关系表达式了


一、关系操作符

C 语言中用于比较的表达式,称为 “关系表达式”,里面使用的运算符就称为“关系操作符”


2. 注意事项
常见错误1:混淆===
代码语言:javascript
复制
int x = 5;
if (x = 3) // 错误:赋值操作,总是为真
{  
    // 这里的代码总是会执行
}


// 正确写法
if (x == 3)// 比较操作
{  
    // 只有当x等于3时才执行
}
  • 防御性编程技巧:将常量放在左边
代码语言:javascript
复制
if (3 == x) // 如果误写成3 = x,编译器会报错
{  
    // 安全的选择
}
常见错误2:连续使用关系运算符
代码语言:javascript
复制
// 错误:不能这样判断范围
if (1 < x < 10) // 总是为真
{  
    /*
      解释:
      因为关系运算符是从左到右计算,所以实际执⾏的是下⾯的表达式
      (1 < x) < 10
    */

    // ...
}

// 正确:使用逻辑与运算符
if (x > 1 && x < 10) 
{
    // ...
}

二、逻辑操作符

逻辑运算符提供“逻辑判断功能”,用于“构建更复杂的逻辑表达式”


1. 逻辑操作符列表

2. 逻辑非运算符!
代码语言:javascript
复制
int flag = 0;

if (!flag) // 相当于 if(flag == 0)
{  
    printf("flag为假\n");
}
3. 逻辑与运算符&&
代码语言:javascript
复制
int month = 4;

// 判断是否为春天(3-5月)
if (month >= 3 && month <= 5) 
{
    printf("现在是春天\n");
}
4. 逻辑或运算符||
代码语言:javascript
复制
int month = 12;

// 判断是否为冬天(12月或1月或2月)
if (month == 12 || month == 1 || month == 2) 
{
    printf("现在是冬天\n");
}

5. 短路求值特性

重要特性:逻辑运算符具有短路求值特性

  • &&:如果左边为假,右边不执行
  • ||:如果左边为真,右边不执行
代码语言:javascript
复制
int a = 0, b = 10;

// 由于a>10为假,b++不会执行
if (a > 10 && b++ > 5) 
{
    // ...
}

printf("b = %d\n", b);  // 输出:b = 10

// 由于a<5为真,b++不会执行
if (a < 5 || b++ > 5) 
{
    // ...
}

printf("b = %d\n", b);  // 输出:b = 10

九、分支语句综合练习

1. 成绩等级判断
代码语言:javascript
复制
#include <stdio.h>

int main() {
    int score = 0;
    printf("请输入成绩(0-100): ");
    scanf("%d", &score);

    if (score < 0 || score > 100) 
    {
        printf("成绩无效\n");
    } else if (score >= 90) {
        printf("优秀\n");
    } else if (score >= 80) {
        printf("良好\n");
    } else if (score >= 70) {
        printf("中等\n");
    } else if (score >= 60) {
        printf("及格\n");
    } else {
        printf("不及格\n");
    }

    return 0;
}
2. 闰年判断
代码语言:javascript
复制
#include <stdio.h>

int main() 
{
    printf("请输入年份: ");

    int year = 0; scanf("%d", &year);

    // 闰年条件:能被4整除但不能被100整除,或者能被400整除
    if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) 
    {
        printf("%d年是闰年\n", year);
    }
    else 
    {
        printf("%d年不是闰年\n", year);
    }

    return 0;
}

十、学习建议

  1. 多动手实践:亲自编写和测试代码,理解每个概念
  2. 使用大括号:即使只有一条语句,也使用大括号明确代码块
  3. 注意运算符优先级:不确定时使用括号明确计算顺序
  4. 理解短路求值:利用这一特性编写更高效的代码
  5. 调试技巧:使用printf语句输出中间结果,帮助理解程序执行流程

🎯 记住:编程是实践的艺术,多写代码才能真正掌握这些概念!

敬请期待……

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-11-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、基础运算操作符
    • 一、基础算术运算符一览表
    • 二、特殊运算符详解
      • 1. 取模运算符 %
      • 2. 整数除法 vs 浮点数除法
      • 三、复合赋值运算符
    • 四、自增/自减运算符
      • 前置 vs 后置的区别
      • 记忆技巧:
    • 五、优先级与结合性
      • 基本概念
      • 运算符优先级表(从高到低)
      • 示例分析
    • 六、实战建议
      • 1. 多用括号明确意图
      • 2. 避免复杂表达式
      • 3. 注意数据类型匹配
  • 二、关系、逻辑操作符与分支、循环语句
    • 一、结构化程序设计基础
    • 二、分支语句:if-else语句
      • 1.if 语句
      • 2. if-else 语句
      • 3. 分支中包含多条语句
      • 三、嵌套分支语句
      • 四、悬空else问题
      • 五、条件操作符:
      • 六、switch语句
    • 三、关系、逻辑操作符
      • 一、关系操作符
      • 2. 注意事项
      • 二、逻辑操作符
      • 1. 逻辑操作符列表
      • 2. 逻辑非运算符!
      • 3. 逻辑与运算符&&
      • 4. 逻辑或运算符||
      • 5. 短路求值特性
    • 九、分支语句综合练习
      • 1. 成绩等级判断
      • 2. 闰年判断
    • 十、学习建议
    • 敬请期待……
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档