Skip to content

入门

本章将带你了解C语言的基本概念,完成开发环境的搭建,并编写你的第一个C语言程序。

C语言简介

C语言的历史

C语言由丹尼斯·里奇(Dennis Ritchie)于1972年在贝尔实验室开发。最初是为了编写UNIX操作系统而设计的。

c
/*
 * C语言的发展历程:
 * 1972年 - Dennis Ritchie 开发C语言
 * 1978年 - 《The C Programming Language》出版
 * 1989年 - ANSI C 标准发布(C89/C90)
 * 1999年 - C99 标准发布
 * 2011年 - C11 标准发布
 * 2018年 - C18 标准发布
 */

C语言的特点

c
/*
 * C语言的主要特点:
 * 
 * 1. 简洁高效
 *    - 只有32个关键字
 *    - 生成的代码执行效率高
 * 
 * 2. 可移植性好
 *    - 用C语言编写的程序可以在不同平台编译运行
 *    - 只需少量修改或无需修改
 * 
 * 3. 功能丰富
 *    - 支持结构化编程
 *    - 提供丰富的运算符
 *    - 支持位操作
 * 
 * 4. 灵活性强
 *    - 可以直接操作内存
 *    - 支持指针运算
 *    - 可以嵌入汇编代码
 * 
 * 5. 应用广泛
 *    - 操作系统开发
 *    - 嵌入式系统
 *    - 驱动程序
 *    - 系统软件
 */

开发环境搭建

Windows环境

bash
# 方式1:安装 MinGW-w64
# 1. 下载 MinGW-w64 安装包
# 2. 安装时选择 x86_64 架构
# 3. 将 bin 目录添加到系统 PATH

# 方式2:安装 Visual Studio
# 1. 下载 Visual Studio Community
# 2. 安装时选择"使用C++的桌面开发"

# 验证安装
gcc --version

Linux环境

bash
# Debian/Ubuntu
sudo apt update
sudo apt install build-essential

# CentOS/RHEL
sudo yum groupinstall "Development Tools"

# 验证安装
gcc --version

macOS环境

bash
# 安装 Xcode Command Line Tools
xcode-select --install

# 或使用 Homebrew 安装 GCC
brew install gcc

# 验证安装
gcc --version

开发工具推荐

c
/*
 * 常用的C语言开发工具:
 * 
 * 1. VS Code + C/C++ 扩展
 *    - 轻量级,插件丰富
 *    - 支持代码补全、调试
 * 
 * 2. Visual Studio
 *    - 功能强大的 IDE
 *    - 内置调试器
 * 
 * 3. CLion
 *    - JetBrains 出品
 *    - 智能代码分析
 * 
 * 4. Vim/Emacs
 *    - 命令行编辑器
 *    - 需要配置插件
 */

第一个C程序

Hello World

c
/*
 * 第一个C程序:Hello World
 * 文件名:hello.c
 */

#include <stdio.h>  /* 包含标准输入输出头文件 */

/*
 * main函数是程序的入口点
 * int 表示函数返回整数类型
 */
int main(void)
{
    /* printf 是标准库函数,用于输出文本 */
    printf("Hello, World!\n");  /* \n 表示换行符 */
    
    /* return 0 表示程序正常结束 */
    return 0;
}

编译和运行

bash
# 编译程序
gcc hello.c -o hello

# 运行程序
./hello        # Linux/macOS
hello.exe      # Windows

# 输出结果
# Hello, World!

编译选项

bash
# 常用GCC编译选项

# 指定输出文件名
gcc hello.c -o hello

# 启用警告信息
gcc -Wall hello.c -o hello

# 启用调试信息
gcc -g hello.c -o hello

# 优化代码
gcc -O2 hello.c -o hello

# 指定C标准
gcc -std=c99 hello.c -o hello
gcc -std=c11 hello.c -o hello

# 组合使用
gcc -Wall -g -std=c11 hello.c -o hello

程序结构详解

基本结构

c
/*
 * C程序的基本结构
 */

/* 1. 预处理指令 */
#include <stdio.h>    /* 包含头文件 */
#define PI 3.14159    /* 定义常量 */

/* 2. 函数声明(原型) */
int add(int a, int b);  /* 函数原型 */

/* 3. 全局变量 */
int global_var = 100;

/* 4. main函数(程序入口) */
int main(void)
{
    /* 局部变量 */
    int local_var = 10;
    
    /* 函数调用 */
    int result = add(5, 3);
    
    /* 输出结果 */
    printf("结果: %d\n", result);
    
    return 0;  /* 返回状态码 */
}

/* 5. 函数定义 */
int add(int a, int b)
{
    return a + b;
}

注释

c
/*
 * C语言支持两种注释方式
 */

#include <stdio.h>

int main(void)
{
    // 单行注释(C99标准支持)
    // 这是单行注释,只注释这一行
    
    /*
     * 多行注释
     * 可以跨越多行
     * 用于详细的说明
     */
    
    printf("注释示例\n");
    
    /* 注释不能嵌套 */
    /* 
     * /* 这样写会导致编译错误 */
     */
    
    return 0;
}

头文件

c
/*
 * 常用的标准头文件
 */

#include <stdio.h>    /* 标准输入输出 */
#include <stdlib.h>   /* 标准库函数 */
#include <string.h>   /* 字符串处理 */
#include <math.h>     /* 数学函数 */
#include <time.h>     /* 时间函数 */
#include <ctype.h>    /* 字符处理 */
#include <stdbool.h>  /* 布尔类型(C99) */

int main(void)
{
    /* stdio.h 中的函数 */
    printf("Hello\n");        /* 格式化输出 */
    scanf("%d", &num);        /* 格式化输入 */
    
    /* stdlib.h 中的函数 */
    int *ptr = malloc(100);   /* 动态内存分配 */
    free(ptr);                /* 释放内存 */
    
    /* string.h 中的函数 */
    char s1[20] = "Hello";
    char s2[20] = "World";
    strcat(s1, s2);           /* 字符串连接 */
    
    /* math.h 中的函数 */
    double result = sqrt(16); /* 平方根 */
    
    return 0;
}

编码规范

命名规范

c
/*
 * C语言命名规范
 */

#include <stdio.h>

/* 宏定义:全大写,下划线分隔 */
#define MAX_SIZE 100
#define PI 3.14159

/* 全局变量:g_ 前缀 */
int g_counter = 0;

/* 函数名:小写,下划线分隔 */
int calculate_sum(int a, int b)
{
    return a + b;
}

/* 结构体名:首字母大写或小写都可以 */
struct StudentInfo {
    char name[50];
    int age;
    float score;
};

/* 枚举名:首字母大写 */
enum WeekDay {
    MONDAY = 1,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY,
    SUNDAY
};

int main(void)
{
    /* 局部变量:小写,下划线分隔或驼峰命名 */
    int student_count = 30;
    int studentCount = 30;  /* 也可以 */
    
    /* 常量变量:全大写 */
    const int MAX_STUDENTS = 50;
    
    return 0;
}

代码风格

c
/*
 * 良好的代码风格
 */

#include <stdio.h>

/* 函数之间空一行 */
int max(int a, int b)
{
    /* 运算符两边加空格 */
    if (a > b) {
        return a;
    } else {
        return b;
    }
}

/* 大括号风格:K&R风格或Allman风格 */
// K&R风格(推荐)
void func1(void) {
    printf("K&R风格\n");
}

// Allman风格
void func2(void)
{
    printf("Allman风格\n");
}

int main(void)
{
    int arr[] = {1, 2, 3, 4, 5};
    int i;
    int sum = 0;
    
    /* 每行只写一条语句 */
    for (i = 0; i < 5; i++) {
        sum += arr[i];
    }
    
    /* 长行可以拆分 */
    printf("数组的和是: %d\n", sum);
    
    return 0;
}

常见错误

编译错误

c
/*
 * 常见的编译错误
 */

#include <stdio.h>

int main(void)
{
    /* 错误1:缺少分号 */
    int a = 10  /* 错误:缺少分号 */
    /* 正确:int a = 10; */
    
    /* 错误2:变量未声明 */
    /* printf("%d\n", x); */  /* 错误:x未声明 */
    
    /* 错误3:类型不匹配 */
    int b = "hello";  /* 警告:类型不匹配 */
    
    /* 错误4:括号不匹配 */
    if (a > 5 {
        printf("a > 5\n");
    }
    
    /* 错误5:头文件未包含 */
    /* strcpy(s1, s2); */  /* 错误:未包含string.h */
    
    return 0;
}

运行时错误

c
/*
 * 常见的运行时错误
 */

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int arr[5] = {1, 2, 3, 4, 5};
    int *ptr = NULL;
    
    /* 错误1:数组越界 */
    /* arr[10] = 100; */  /* 未定义行为 */
    
    /* 错误2:空指针解引用 */
    /* *ptr = 10; */  /* 程序崩溃 */
    
    /* 错误3:除零错误 */
    int a = 10;
    int b = 0;
    /* int c = a / b; */  /* 运行时错误 */
    
    /* 错误4:内存泄漏 */
    int *p = (int*)malloc(sizeof(int) * 10);
    /* 忘记 free(p); */
    
    /* 正确做法 */
    if (p != NULL) {
        free(p);
        p = NULL;
    }
    
    /* 错误5:栈溢出 */
    /* int large_arr[10000000]; */  /* 可能导致栈溢出 */
    
    return 0;
}

调试技巧

使用printf调试

c
/*
 * 使用printf进行调试
 */

#include <stdio.h>

int factorial(int n)
{
    /* 调试输出 */
    printf("DEBUG: factorial(%d) called\n", n);
    
    if (n <= 1) {
        printf("DEBUG: base case, returning 1\n");
        return 1;
    }
    
    int result = n * factorial(n - 1);
    printf("DEBUG: returning %d\n", result);
    return result;
}

int main(void)
{
    int n = 5;
    int result = factorial(n);
    printf("5! = %d\n", result);
    
    return 0;
}

使用GDB调试

bash
# 编译时加入调试信息
gcc -g program.c -o program

# 启动GDB
gdb ./program

# GDB常用命令
# break main    - 在main函数设置断点
# break 10      - 在第10行设置断点
# run           - 运行程序
# next          - 执行下一行(不进入函数)
# step          - 执行下一行(进入函数)
# continue      - 继续执行
# print var     - 打印变量值
# backtrace     - 显示调用栈
# quit          - 退出GDB

小结

本章学习了:

  • C语言简介:历史、特点、应用领域
  • 开发环境:Windows、Linux、macOS环境搭建
  • 第一个程序:Hello World 的编写、编译、运行
  • 程序结构:预处理指令、main函数、函数定义
  • 编码规范:命名规范、代码风格
  • 常见错误:编译错误、运行时错误
  • 调试技巧:printf调试、GDB调试

下一章,我们将学习基础语法,了解C语言的变量、常量和输入输出。