好的,我们来一次C语言基础的系统梳理,重点覆盖你提到的三大块:输入输出、运算符、流程控制。
这份内容适合零基础或想快速复习的人,全部用最实用、最常考的写法和注意点,强烈建议你边看边敲代码验证。
一、C程序基本结构(先打好地基)
#include <stdio.h> // 标准输入输出头文件
int main(void) // main函数是程序入口
{
// 你的代码写在这里
return 0; // 返回0表示正常结束,非0表示出错
}
编译运行(常见命令):
gcc hello.c -o hello # 编译
./hello # Linux/Mac运行
hello.exe # Windows运行
二、输入输出(最常用、最容易错)
| 函数 | 作用 | 常用格式符 | 注意点 / 常见坑 |
|---|---|---|---|
printf | 格式化输出到屏幕 | %d %ld %f %lf %c %s %p | 必须匹配类型,否则未定义行为 |
scanf | 格式化输入从键盘 | 同上 | &取地址,空格/回车会影响输入,极易出错 |
getchar | 读一个字符 | 无 | 返回 int(EOF = -1) |
putchar | 输出一个字符 | 无 | — |
gets | 读一行(危险,已废弃) | 无 | 缓冲区溢出风险,永远不要用 |
fgets | 安全读一行 | 需要指定大小 | 推荐替代 gets |
puts | 输出字符串+换行 | 无 | 比 printf(“%s\n”, str) 稍快 |
最常用示例(敲一遍!)
#include <stdio.h>
int main() {
int age;
float height;
char gender;
char name[20]; // 字符串数组
printf("请输入年龄、身高、性别(M/F)和姓名:\n");
// 正确写法:scanf 需要 & 取地址
scanf("%d %f %c", &age, &height, &gender);
// 吃掉残留的换行符(常见坑)
getchar(); // 或 scanf("%*c");
// 安全读字符串(包含空格)
fgets(name, sizeof(name), stdin);
// 去掉 fgets 带来的换行符
if (name[strlen(name)-1] == '\n')
name[strlen(name)-1] = '\0';
printf("你好,%s!\n", name);
printf("年龄:%d 身高:%.1f 性别:%c\n", age, height, gender);
return 0;
}
scanf 经典坑总结:
- 不要忘
& %s不要加&(数组名就是地址)- 连续输入时,空格/回车会残留 → 常用
getchar()或%*c吃掉 - 建议用
fgets+sscanf组合,更安全
三、运算符全梳理(优先级 + 结合性 + 常见陷阱)
| 优先级 | 运算符 | 结合性 | 说明与陷阱 |
|---|---|---|---|
| 1 | () [] . -> | 左→右 | 后缀运算符最高 |
| 2 | ! ~ ++ — – + * & (type) sizeof | 右→左 | 单目运算符;注意 ! 只对0/非0,~ 是按位取反 |
| 3 | * / % | 左→右 | 模运算 % 两边必须整数 |
| 4 | + – | 左→右 | — |
| 5 | << >> | 左→右 | 移位(有符号右移看编译器) |
| 6 | < <= > >= | 左→右 | 关系运算符 |
| 7 | == != | 左→右 | 相等判断 |
| 8 | & | 左→右 | 按位与 |
| 9 | ^ | 左→右 | 按位异或 |
| 10 | 左→右 | ||
| 11 | && | 左→右 | 逻辑与(短路) |
| 12 | |||
| 13 | ?: | 右→左 | 三目运算符 |
| 14 | = += -= *= /= %= <<= >>= &= ^= | = | 右→左 |
| 15 | , | 左→右 | 逗号表达式(最低优先级,常用于 for 循环) |
最常考/最坑的点:
int a = 5, b = 3;
printf("%d\n", a++ + ++b); // 5 + 4 = 9 (后++ 先用后加,前++ 先加后用)
int x = 1;
printf("%d\n", x++ && ++x); // 1 && 2 → 1(短路,后面的 ++x 不执行)
int n = 10;
n += n++; // 未定义行为!不要写这种代码
推荐:永远不要在同一表达式中多次修改同一变量。
四、流程控制全家桶(顺序 → 分支 → 循环)
1. 分支结构
// if
if (age >= 18) {
printf("成人\n");
} else if (age >= 13) {
printf("青少年\n");
} else {
printf("儿童\n");
}
// 三目运算符(表达式)
int max = (a > b) ? a : b;
// switch(只能用于整型/字符型,不能范围判断)
switch (grade) {
case 'A': printf("优秀\n"); break;
case 'B':
case 'C': printf("及格\n"); break; // 穿透
default: printf("不及格\n");
}
2. 循环结构(三种 + 对比)
| 循环类型 | 语法 | 特点与适用场景 | 跳出/继续 |
|---|---|---|---|
| while | while(条件) { … } | 先判断后执行,适合未知次数 | break / continue |
| do-while | do { … } while(条件); | 至少执行一次,适合菜单等 | 同上 |
| for | for(初始化; 条件; 增量) { … } | 最常用,计数/已知次数清晰 | 同上 |
经典 for 变种(很实用)
// 死循环(常见写法)
for(;;) { ... } // 等价 while(1)
// 逗号表达式(for 中最强)
for(int i=0, j=100; i<10 && j>50; i++, j-=5) {
printf("%d %d\n", i, j);
}
// 遍历数组(现代写法)
int arr[] = {1,2,3,4,5};
for(int i=0; i<sizeof(arr)/sizeof(arr[0]); i++) { ... }
goto(了解即可,生产代码尽量别用)
error:
printf("出错了\n");
// ...
if (失败) goto error;
五、快速自测清单(做完这些说明你基础过关)
scanf("%d", age);错在哪里?(忘了 &)printf("%f", 3/2);输出多少?(1.000000,因为整数除法)a = 5; b = a++ + ++a;b 是多少?(未定义行为!)while((c=getchar()) != '\n') putchar(c);作用是什么?(回显一行)for(;;)等价于什么?(while(1))- switch 里不写 break 会怎样?(case 穿透)
- 三目运算符的结合性是?(右结合)
do { ... } while(0);有什么用?(宏定义中常用,避免语法问题)
把上面这些点都敲代码验证一遍,C语言的输入输出 + 运算符 + 流程控制 你就基本掌握了。
接下来想深入哪一块?(数组、函数、指针、结构体、文件操作、常见算法题…)直接告诉我,我继续给你最实用的总结和代码。