一个功能完备的程序,必然离不开数据的输入输出与逻辑处理,它们也同样是C语言的核心语法。

标准输入输出

C语言使用标准库函数进行输入输出,需要包含头文件stdio.h

  • 输出函数 printf()

用于格式化输出到控制台,不换行。

示例:

#include<stdio.h>
int main()
{
    int num = 10;
    printf("Hello World\n");
    printf("数字:%d\n",num);
}

编译、运行,你将得到类似以下的输出 TERMINAL

需要输出数据时,我们需要使用格式符来“告诉”程序应该以什么样的格式来打印数据,例如示例中的第二个printf的%d,代表十进制整数。

常见的格式符:%d(整数int)、%f(浮点数float/double)、%lf(专用于双精度浮点型double)、%c(字符char)、%s(字符串)。

有关格式说明符的详细内容,请至此页浏览传送门

  • 输入函数 scanf()

用于从控制台读取输入。

示例:

#include<stdio.h>
int main()
{
    int num;
    printf("输入一个整数:");
    scanf("%d",&num);
    printf("您输入了数字%d\n",num);
}

输出效果: TERMINAL 需注意的是,除了字符串数组,所有变量的输入都需要使用&符号进行取地址运算,这将得到变量的地址,而字符串数组的变量名称本身为指针,故不需要取地址运算。

C语言的函数参数传递是传值的,函数内部无法直接修改调用者的变量,通过传递变量的地址(指针),scanf才能将读取的数据直接写入到该地址所对应的内存中

流程控制语句

控制程序执行流程,包括条件语句和循环语句。

在C语言中,条件语句和循环语句是控制程序流程的核心结构,它们允许程序根据不同的情况执行不同的代码块,或者重复执行特定的任务。

条件语句

条件语句用于根据表达式的真假(非零为真,零为假)来决定执行哪部分代码。

1. if 语句

最基本的条件判断。如果条件为真,则执行后面的代码块。

if (条件表达式) {
    // 条件为真时执行的语句
}

示例:判断一个数是否为正数。

int a=3;
if(a>0){
    printf("%d是正数。");
}

2. if-else 语句

if的基础上增加一个分支。如果条件为真执行if块,否则执行else块。

if (条件表达式) {
    // 条件为真时执行
} else {
    // 条件为假时执行
}

示例:判断一个数是奇数还是偶数。

int num = 7;
if (num % 2 == 0) {
    printf(“%d 是偶数。\n”, num);
} else {
    printf(“%d 是奇数。\n”, num);
}

3. if-else if-else 语句

用于多重条件判断,可以串联多个条件。

if (条件1) {
    // 条件1为真时执行
} else if (条件2) {
    // 条件2为真时执行
} else {
    // 以上条件均为假时执行
}

示例:根据分数评定等级。

int score = 85;
if (score >= 90) {
    printf(“优秀\n”);
} else if (score >= 80) {
    printf(“良好\n”);
} else if (score >= 60) {
    printf(“及格\n”);
} else {
    printf(“不及格\n”);
}

4. switch 语句

当需要基于一个整型或字符型表达式的多个固定值进行分支选择时,使用switch比多重if-else更清晰。

switch (表达式) {
    case 常量值1:
        // 语句
        break;
    case 常量值2:
        // 语句
        break;
    default:
        // 所有case都不匹配时执行
        break;
}
  • break:用于跳出整个switch语句,防止继续执行下一个case(即“穿透”)。
  • default:可选的,当所有case都不匹配时执行。

示例:根据输入选择菜单。

int choice = 2;
switch (choice) {
    case 1:
        printf(“执行操作一\n”);
        break;
    case 2:
        printf(“执行操作二\n”);
        break;
    case 3:
        printf(“执行操作三\n”);
        break;
    default:
        printf(“无效选择\n”);
        break;
}

case穿透并非设计缺陷,而是一个可以被谨慎利用的特性。关键在于清晰的注释和意图明确的代码结构,确保其他开发者能立刻明白这是有意为之,而非遗漏了break。

示例:输出评语。

假设90分以上为‘A’,80-89为‘B’,70-79为‘C’,60-69为‘D’,60以下为‘E’。我们希望为‘A’、‘B’、‘C’等级输出“良好及以上”,并为‘A’单独点赞。

#include <stdio.h>
int main() {
    char grade = 'B';
    printf("你的等级是 %c:", grade);

    switch (grade) {
        case 'A':
            printf("太棒了!");
            // 注意:此处没有break,会穿透到case 'B'
        case 'B':  //同样没有break,穿透到case 'C'
        case 'C':
            printf("你的表现属于良好及以上。\n");
            break; // 在这里统一跳出,'A','B','C'都会执行上一行打印
        case 'D':
            printf("需要加油。\n");
            break;
        case 'E':
            printf("务必重视。\n");
            break;
        default:
            printf("无效的等级。\n");
            break;
    }
    return 0;
}

循环语句

循环语句用于重复执行一段代码,直到满足终止条件。

1. while 循环

先判断条件,条件为真则执行循环体,直到条件为假。

while (条件表达式) {
    // 循环体语句
}

示例:计算1到5的合。

int i = 1, sum = 0;
while (i <= 5) {
    sum += i; // 累加
    i++;      // 更新循环变量
}
printf(“1到5的和为:%d\n”, sum);

2. do-while 循环

先执行一次循环体,再判断条件。条件为真则继续循环。循环体至少执行一次

do {
    // 循环体语句
} while (条件表达式);

示例:用户输入认证,确保输入一个正数。

int input;
do {
    printf(“请输入一个正数:”);
    scanf(“%d”, &input);
} while (input <= 0);
printf(“您输入的正数是:%d\n”, input);

3. for 循环

最常用的循环,结构紧凑,将循环变量的初始化、条件判断和更新集中在一行。

for (初始化表达式; 循环条件表达式; 更新表达式) {
    // 循环体语句
}

示例:打印数字0到9:

for (int i = 0; i < 10; i++) {
    printf("%d ", i);
}

三、循环控制语句

在循环体内使用,可以改变循环的正常执行流程。

  • break:立即终止整个循环(或switch语句),跳出到循环外的下一条语句。
  • continue:跳过本次循环中continue之后的语句,直接进入下一次循环的条件判断。

示例:break和continue的区别。

// break 示例:找到第一个能被7整除的数就停止循环
printf(“break 示例:”);
for (int i = 1; i <= 20; i++) {
    if (i % 7 == 0) {
        printf(“找到 %d\n”, i);
        break; // 找到后立即跳出整个for循环
    }
}

// continue 示例:打印1到10之间的奇数
printf(“continue 示例:”);
for (int i = 1; i <= 10; i++) {
    if (i % 2 == 0) {
        continue; // 如果是偶数,跳过本次循环的后续语句(printf),直接进行i++
    }
    printf(“%d ”, i); // 只有奇数会执行到这里
}
printf(“\n”);

通过组合这些语句,可以构建出处理各种复杂逻辑的程序流程。

那么,语句有这么多,功能还类似,如何选择更好呢?

  • 语义优先:选择能让代码意图最清晰、最易读的语句。这是最重要的原则。
  • switch用于多路离散分支:基于同一个整型变量的多个固定值跳转时,优先考虑 switch,它更规整。
  • for用于计数或明确遍历:当循环有明确的控制变量和步进时,for是首选。
  • while用于条件等待或非计数循环:当循环条件更复杂,或主要依赖外部状态时,while更自然。
  • do-while确保了循环体至少执行一次:这在处理需要先执行再判断的逻辑时(例如输入验证),是 for和普通 while无法直接优雅表达的。

这些选择没有绝对的“对错”,但遵循这些惯例能让你的代码更容易被他人(以及未来的你)理解。