C 基础语法

环境装好后,我们来系统过一遍 C 的基础语法。这一章不涉及复杂概念,只讲程序"长什么样"——结构、注释、分号、关键字、命名规则。读完你就能看懂任何 C 代码的大致框架。

1. C 程序的基本结构

一个能运行的 C 程序最少包含两部分:#include 预处理指令和 main 函数。看这个例子:

#include <stdio.h>          // 预处理指令:引入标准输入输出库
#include <stdlib.h>          // 引入标准库(malloc/rand 等)

int main(void) {             // 主函数:程序入口
    printf("Hello!\n");       // 函数调用语句
    return 0;                 // 返回 0 表示正常结束
}
// 程序从 main 开始执行,执行完 main 就结束

几个要点:

2. 注释

注释是写给程序员看的,编译器会忽略。C 支持两种注释:

// 这是单行注释(C99 起支持),双斜杠开头到行尾

/* 这是多行注释,
   可以跨越多行,
   用斜杠星号包裹 */

/*
   块注释常用于:
   - 文件开头的版权与说明
   - 函数的功能描述
   - 临时禁用一大段代码
*/

/* 注意:块注释不能嵌套!
   /* 这样嵌套会报错 */
   因为第一个 */ 就结束了整个注释 */

注意 C89 不支持单行注释 //,只能用 /* */;但 C99 之后两种都支持了,现在可以放心用 //。另外块注释不能嵌套,这是新手常踩的坑。

3. 分号与语句

C 和 Java/JS 一样每条语句以分号结尾,分号是语句的一部分。这条规则没有例外——少了分号编译器会报错。

// 每条语句必须以分号结尾
int a = 1;     // 末尾的分号是语句的一部分
int b = 2;
int c = a + b;

// 一行可以写多条语句(但不推荐)
int x = 1; int y = 2;

// 一条语句也可以跨多行
int sum = a +
          b +
          c;

// 空语句:只有一个分号(有时用在空循环体)
while (getchar() != '\n')
    ;   // 空语句,什么都不做

4. 标识符命名规则

标识符是程序员自己起的名字(变量、函数、类型名)。C 的命名规则:

// 合法标识符:字母、数字、下划线,不能以数字开头
int age;
int _count;
int score2;
int MAX_SIZE;        // 全大写常用于常量/宏
int calcSum();       // 驼峰或下划线都可以

// 非法标识符(会报错)
// int 2nd_place;    // 不能以数字开头
// int my-score;     // 不能有连字符
// int for;          // 不能用关键字

// 区分大小写!
int Num = 10;
int num = 20;        // Num 和 num 是两个不同的变量

命名风格有两种主流约定:下划线(calc_sum,C/Linux 内核常用)和驼峰(calcSum,Java/JS 常用)。C 项目推荐下划线风格,保持和标准库一致。

5. C 的关键字

C 语言保留了一些词作为关键字,你不能用它们做标识符。C89 有 32 个关键字,比 Java(50)和 C++(90+)少:

// C89 的 32 个关键字(按字母序):
// auto      break     case      char
// const     continue  default   do
// double    else      enum      extern
// float     for       goto      if
// int       long      register  return
// short     signed    sizeof    static
// struct    switch    typedef   union
// unsigned  void      volatile  while

// C99 新增(5 个):
// _Bool  _Complex  _Imaginary  inline  restrict

// C11 新增(7 个):
// _Alignas  _Alignof  _Atomic  _Generic
// _Noreturn  _Static_assert  _Thread_local

// 这些关键字不能用作变量名/函数名

按用途分组记忆更容易:

6. printf 格式化输出(重点)

printf 是 C 里最常用的函数,它通过占位符(format specifier)把变量插入字符串。占位符以 % 开头,不同类型用不同字母:

#include <stdio.h>

int main(void) {
    int age = 20;
    float pi = 3.14f;
    char grade = 'A';
    char name[] = "小明";

    // 常用占位符
    printf("整数:    %d\n", age);        // %d  整数
    printf("浮点:    %f\n", pi);         // %f  浮点(默认 6 位小数)
    printf("字符:    %c\n", grade);      // %c  单字符
    printf("字符串:  %s\n", name);       // %s  字符串
    printf("八进制:  %o\n", 64);         // %o  八进制
    printf("十六进制:%x\n", 255);        // %x  十六进制
    printf("指针地址:%p\n", (void*)&age); // %p  指针

    // 控制宽度和精度
    printf("保留2位: %.2f\n", pi);       // 3.14
    printf("占8位:  %8d\n", 42);         //       42
    printf("左对齐:  %-8d|\n", 42);      // 42      |
    return 0;
}

常用占位符速查:

控制格式:%8d 占 8 位宽度右对齐,%-8d 左对齐,%.2f 保留 2 位小数,%08d 用 0 填充。

7. 空白符与代码风格

C 对待空白符(空格、Tab、换行)大部分情况下是不敏感的——你可以在任意位置加空格或换行。但有几点要注意:

C 没有 Go 的 gofmt 那种官方格式化工具,但有第三方的 clang-format,VS Code 装 plugin 后保存即可自动格式化,能统一团队风格。

小结

这一章你了解了 C 程序的整体骨架:include → main → return;知道了注释、分号、关键字、命名规则;记住了 printf 的常用占位符。下一篇我们看 C 的变量——这是装数据的基础。

← 上一篇 C 环境搭建

下一篇 C 变量

✈️💬