3. C语言基础语法

各位同学,欢迎来到第三章。从这一章开始,我们正式动手写代码。

说实话,很多初学者觉得语法枯燥。但我告诉你,语法就是你和计算机沟通的「暗号」。你写对了,它听你的;写错了,它罢工给你看。我在项目里见过太多因为少写一个分号、搞错数据类型导致的线上事故。嗯,咱们今天就把这些基本功打扎实。

3.1 注释:给代码加个「说明书」

注释是写给人看的,不是给机器看的。编译器会直接忽略它。

我个人习惯,在写复杂逻辑之前,先把注释写好。就像画图纸一样,先搭框架再填细节。

C语言有两种注释方式:

  • 单行注释:// 这是单行注释,从双斜杠开始到行尾结束。
  • 多行注释:/* 这是多行注释 */,可以跨越多行。
#include <stdio.h>

int main() {
    // 单行注释:下面这行代码打印问候语
    printf("Hello, World!\n");

    /*
        多行注释:
        这里可以写一大段说明。
        比如解释这个函数的作用。
    */
    return 0;
}

我的小建议:注释要「说人话」。别写「i++ 表示 i 自增1」这种废话。要写「这里循环遍历用户输入的数组,查找最大值」。我曾经接手过一个项目,注释全是拼音缩写,看得我头皮发麻。

3.2 变量:给数据起个名字

变量,说白了就是一块内存空间,我们给它贴了个标签。你可以往里面存数据,也可以随时取出来用。

变量声明的基本格式:

数据类型 变量名;

比如:

int age;        // 声明一个整型变量,名叫 age
float price;    // 声明一个浮点型变量,名叫 price
char grade;     // 声明一个字符型变量,名叫 grade

变量命名规则(踩坑总结):

  • 只能包含字母、数字、下划线。
  • 不能以数字开头。
  • 不能是C语言的关键字(比如 int、if、return 这些)。
  • 区分大小写:Age 和 age 是两个不同的变量。

我曾经犯过的错:有一次我用了 int 1st_number;,编译器直接报错。你想想看,变量名以数字开头,编译器根本不知道这是变量名还是数字字面量。记住:字母或下划线开头,准没错。

3.3 常量:固定不变的值

常量就是程序运行过程中不能改变的值。比如圆周率 π,你总不能今天3.14,明天3.15吧?

定义常量的两种方式:

  1. 使用 #define 宏定义(预处理阶段替换)
  2. 使用 const 关键字(编译阶段检查)
#include <stdio.h>

#define PI 3.14159        // 宏定义常量,没有分号
const int MAX_SIZE = 100; // const 常量,有分号

int main() {
    printf("圆周率 PI = %f\n", PI);
    printf("最大容量 MAX_SIZE = %d\n", MAX_SIZE);

    // PI = 3.14;  // 错误!不能修改常量
    return 0;
}

我个人更推荐用 const:因为 const 有类型检查,编译器能帮你发现错误。而 #define 只是简单的文本替换,有时候会引发一些奇怪的 bug。我在一个嵌入式项目里就吃过这个亏——宏定义替换后,表达式优先级搞错了,查了一下午。

3.4 基本数据类型:int、float、char

C语言的数据类型,说白了就是告诉编译器:这块内存我要怎么用,占多大地方。

数据类型 关键字 占用空间 取值范围(32位系统) 示例
整型 int 4字节 -2,147,483,648 ~ 2,147,483,647 int a = 10;
单精度浮点型 float 4字节 约 ±3.4e-38 ~ ±3.4e+38 float b = 3.14f;
字符型 char 1字节 -128 ~ 127 或 0 ~ 255 char c = 'A';

几个容易忽略的点:

  • float 字面量后面加 f,比如 3.14f。不加的话,默认是 double 类型。
  • char 本质上是一个小整数。你可以用 char ch = 65;,它和 char ch = 'A'; 是一样的。因为 ASCII 码中 'A' 就是 65。
  • int 的大小取决于平台。在16位系统上是2字节,在32/64位系统上是4字节。写跨平台代码时要小心。

3.5 printf 与 scanf:和程序「对话」

这两个函数是C语言最基础的输入输出工具。说白了,printf 是让程序说话,scanf 是让程序听你说话。

3.5.1 printf:格式化输出

基本格式:

printf("格式控制字符串", 输出列表);

格式控制字符串里用 格式占位符 来占位置,后面再填实际的值。

占位符 对应数据类型 示例
%d int printf("%d", 10);
%f float / double printf("%f", 3.14);
%c char printf("%c", 'A');
%s 字符串 printf("%s", "hello");
#include <stdio.h>

int main() {
    int age = 25;
    float height = 1.75f;
    char grade = 'A';

    printf("年龄:%d 岁\n", age);
    printf("身高:%.2f 米\n", height);  // %.2f 保留两位小数
    printf("成绩等级:%c\n", grade);

    return 0;
}

3.5.2 scanf:格式化输入

scanf 用来从键盘读取数据。注意:变量前面要加 & 取地址符。这是初学者最容易忘的。

基本格式:

scanf("格式控制字符串", &变量1, &变量2, ...);
#include <stdio.h>

int main() {
    int num;
    float price;
    char ch;

    printf("请输入一个整数:");
    scanf("%d", &num);  // 注意 & 符号

    printf("请输入一个浮点数:");
    scanf("%f", &price);

    printf("请输入一个字符:");
    scanf(" %c", &ch);  // %c 前面加空格,吃掉之前的换行符

    printf("你输入了:%d, %.2f, %c\n", num, price, ch);

    return 0;
}

我曾经踩过的坑:

  • 忘记加 &:程序直接崩溃。因为 scanf 需要知道变量的地址才能把值写进去。
  • 输入格式不匹配:比如你写 scanf("%d", &num); 但用户输入了字母,程序会直接跳过,变量保持原值。而且输入缓冲区会残留数据,导致后续 scanf 全部失效。
  • %c 前面的空格:如果不加空格,scanf 会读取上一次输入留下的换行符 \n,而不是你想要的字符。这个小问题当年让我调试了半小时。

3.6 知识体系总览

下面这张图,帮你把本章的知识点串起来。你看一遍,心里就有谱了。

C语言基础语法 注释 // 单行注释 /* 多行注释 */ 变量与常量 变量:可修改 常量:#define / const 基本数据类型 int / float / char 输入输出函数 printf 输出 %d %f %c %s scanf 输入 记得加 & 符号 常见陷阱 忘记 & / 格式不匹配

总结一下:这一章的内容,说白了就是三件事——怎么存数据(变量/常量/数据类型)、怎么输出数据(printf)、怎么输入数据(scanf)。把这些搞明白,你已经能写一些简单的交互程序了。

嗯,我当年学到这里的时候,写了一个「计算器」程序,虽然只能算加减法,但那种成就感至今难忘。你也试试看?