好的,我们来一次C语言基础的系统梳理,重点覆盖你提到的三大块:输入输出、运算符、流程控制。
这份内容适合零基础或想快速复习的人,全部用最实用、最常考的写法和注意点,强烈建议你边看边敲代码验证。
一、C程序基本结构(先打好地基)
#include<stdio.h>// 标准输入输出头文件intmain(void)// main函数是程序入口{// 你的代码写在这里return0;// 返回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>intmain(){intage;floatheight;chargender;charname[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);return0;}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 循环) |
最常考/最坑的点:
inta=5,b=3;printf("%d\n",a+++++b);// 5 + 4 = 9 (后++ 先用后加,前++ 先加后用)intx=1;printf("%d\n",x++&&++x);// 1 && 2 → 1(短路,后面的 ++x 不执行)intn=10;n+=n++;// 未定义行为!不要写这种代码推荐:永远不要在同一表达式中多次修改同一变量。
四、流程控制全家桶(顺序 → 分支 → 循环)
1. 分支结构
// ifif(age>=18){printf("成人\n");}elseif(age>=13){printf("青少年\n");}else{printf("儿童\n");}// 三目运算符(表达式)intmax=(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(inti=0,j=100;i<10&&j>50;i++,j-=5){printf("%d %d\n",i,j);}// 遍历数组(现代写法)intarr[]={1,2,3,4,5};for(inti=0;i<sizeof(arr)/sizeof(arr[0]);i++){...}goto(了解即可,生产代码尽量别用)
error:printf("出错了\n");// ...if(失败)gotoerror;五、快速自测清单(做完这些说明你基础过关)
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语言的输入输出 + 运算符 + 流程控制你就基本掌握了。
接下来想深入哪一块?(数组、函数、指针、结构体、文件操作、常见算法题…)直接告诉我,我继续给你最实用的总结和代码。