一个功能完备的程序,必然离不开数据的输入输出与逻辑处理,它们也同样是C语言的核心语法。
标准输入输出
C语言使用标准库函数进行输入输出,需要包含头文件stdio.h
- 输出函数
printf()
用于格式化输出到控制台,不换行。
示例:
#include<stdio.h>
int main()
{
int num = 10;
printf("Hello World\n");
printf("数字:%d\n",num);
}
编译、运行,你将得到类似以下的输出

需要输出数据时,我们需要使用格式符来“告诉”程序应该以什么样的格式来打印数据,例如示例中的第二个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);
}
输出效果:
需注意的是,除了字符串数组,所有变量的输入都需要使用&符号进行取地址运算,这将得到变量的地址,而字符串数组的变量名称本身为指针,故不需要取地址运算。
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无法直接优雅表达的。
这些选择没有绝对的“对错”,但遵循这些惯例能让你的代码更容易被他人(以及未来的你)理解。