C 语言基础:输入输出、运算符与流程控制全梳理

好的,我们来一次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. 循环结构(三种 + 对比)

循环类型语法特点与适用场景跳出/继续
whilewhile(条件) { … }先判断后执行,适合未知次数break / continue
do-whiledo { … } while(条件);至少执行一次,适合菜单等同上
forfor(初始化; 条件; 增量) { … }最常用,计数/已知次数清晰同上

经典 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;

五、快速自测清单(做完这些说明你基础过关)

  1. scanf("%d", age); 错在哪里?(忘了 &)
  2. printf("%f", 3/2); 输出多少?(1.000000,因为整数除法)
  3. a = 5; b = a++ + ++a; b 是多少?(未定义行为!)
  4. while((c=getchar()) != '\n') putchar(c); 作用是什么?(回显一行)
  5. for(;;) 等价于什么?(while(1))
  6. switch 里不写 break 会怎样?(case 穿透)
  7. 三目运算符的结合性是?(右结合)
  8. do { ... } while(0); 有什么用?(宏定义中常用,避免语法问题)

把上面这些点都敲代码验证一遍,C语言的输入输出 + 运算符 + 流程控制 你就基本掌握了。

接下来想深入哪一块?(数组、函数、指针、结构体、文件操作、常见算法题…)直接告诉我,我继续给你最实用的总结和代码。

文章已创建 4026

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部