Appearance
入门
本章将带你了解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 --versionLinux环境
bash
# Debian/Ubuntu
sudo apt update
sudo apt install build-essential
# CentOS/RHEL
sudo yum groupinstall "Development Tools"
# 验证安装
gcc --versionmacOS环境
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语言的变量、常量和输入输出。
