一、C 语言概述
C 语言诞生于 20 世纪 70 年代的贝尔实验室,由丹尼斯・里奇(Dennis Ritchie)开发,最初是为了编写 UNIX 操作系统 。它作为一种通用的、过程式编程语言,具有高效、灵活、可移植等显著特点。在操作系统领域,Linux 内核的大部分代码都是用 C 语言编写;在嵌入式开发中,C 语言凭借其对硬件的直接操作能力,广泛应用于各类智能设备;在游戏开发方面,许多经典游戏的底层逻辑也依赖 C 语言实现。学习 C 语言,不仅是掌握一门编程语言,更是为后续学习 C++、Java 等高级语言,以及深入理解计算机系统工作原理奠定坚实基础。
二、开发环境搭建
编译器选择
GCC:GNU Compiler Collection 是 Linux 系统中最常用的 C 语言编译器,同时也支持 Windows(通过 MinGW 或 MinGW-w64)和 macOS 系统。它遵循 GPL 协议,具有强大的优化能力和丰富的扩展功能。以 Linux 系统为例,在终端输入gcc --version可查看 GCC 版本,若未安装,使用apt-get install gcc(Debian/Ubuntu 系统)或yum install gcc(Red Hat/CentOS 系统)即可安装。
Clang:由苹果公司主导开发,基于 LLVM 架构,具有编译速度快、错误提示友好等优势,是 macOS 系统的默认编译器,在 Windows 和 Linux 系统上也可安装使用。Clang 在代码分析和诊断方面表现出色,能帮助开发者快速定位代码中的问题。2.集成开发环境(IDE)Dev-C++:专为初学者设计,界面简洁,操作方便。安装完成后,打开软件,依次点击 “文件”-“新建”-“项目”,选择 “Console Application”(控制台应用程序),再选择 “C Project”,设置好项目名称和保存路径,即可创建新的 C 语言项目。Dev-C++ 内置了 GCC 编译器,支持代码高亮、自动补全和调试功能。Code::Blocks:一款开源的跨平台 IDE,支持多种编译器,功能强大且高度可定制。在 Code::Blocks 中创建 C 语言项目,点击 “文件”-“新建”-“项目”,选择 “Console application”,然后按照向导提示完成项目创建。它提供了丰富的插件,如代码分析插件、调试插件等,可满足不同开发者的需求。
三、C 语言基础语法
数据类型
C 语言的数据类型除了常见的int、float、double、char外,还有short(短整型)、long(长整型)、long long(更长整型)等。不同数据类型占用的内存空间和表示范围各不相同,例如在 32 位系统中,int通常占用 4 个字节,取值范围为 - 2147483648 到 2147483647;float占用 4 个字节,能表示约 7 位有效数字;double占用 8 个字节,可表示约 15 - 16 位有效数字 。了解这些特性,有助于根据实际需求合理选择数据类型,提高程序的效率和准确性。
变量与常量
变量命名必须遵循标识符规则:只能由字母、数字和下划线组成,且不能以数字开头,同时不能使用 C 语言的关键字(如int、if、while等)。符号常量的定义方式除了#define,还可以使用const关键字,两者的区别在于#define是宏定义,在预处理阶段进行简单的文本替换,而const定义的常量具有数据类型,会进行类型检查,例如const int num = 10;。
运算符与表达式
C 语言的运算符丰富多样,除了基本的算术、关系和逻辑运算符外,还有位运算符(&、|、^、~、<<、>>)、赋值运算符(=、+=、-=等)和条件运算符(? :)。位运算符常用于对二进制位进行操作,在嵌入式开发和底层编程中应用广泛;条件运算符a? b : c表示若a为真,则表达式的值为b,否则为c,可简化一些简单的if - else语句。例如,求两个数中的较大值,可使用int max = (a > b)? a : b;
控制结构
顺序结构:在顺序结构中,程序按照语句的先后顺序依次执行,这是程序最基本的执行方式。例如,先输入两个数,再计算它们的和并输出:
#include
int main() {
int a, b, sum;
printf("请输入两个整数:");
scanf("%d %d", &a, &b);
sum = a + b;
printf("两数之和为:%d\n", sum);
return 0;
}
选择结构:switch语句适用于多分支情况,当分支条件为常量表达式时,使用switch语句比多个if - else语句更简洁。例如,根据输入的数字输出对应的星期几:
#include
int main() {
int num;
printf("请输入1 - 7的整数:");
scanf("%d", &num);
switch (num) {
case 1:
printf("星期一\n");
break;
case 2:
printf("星期二\n");
break;
case 3:
printf("星期三\n");
break;
case 4:
printf("星期四\n");
break;
case 5:
printf("星期五\n");
break;
case 6:
printf("星期六\n");
break;
case 7:
printf("星期日\n");
break;
default:
printf("输入错误\n");
}
return 0;
}
循环结构:do - while循环先执行循环体,再判断条件,因此循环体至少会执行一次。例如,使用do - while循环实现登录验证,直到用户输入正确的密码:
#include
#include
int main() {
char password[20];
do {
printf("请输入密码:");
scanf("%s", password);
} while (strcmp(password, "123456")!= 0);
printf("登录成功\n");
return 0;
}
四、函数
函数参数传递:C 语言中函数参数传递分为值传递和地址传递。值传递是将实参的值复制一份传递给形参,形参的改变不会影响实参;地址传递是将实参的地址传递给形参,通过形参可以直接修改实参的值。例如,使用地址传递交换两个整数的值:
#include
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
int main() {
int x = 5, y = 10;
swap(&x, &y);
printf("x = %d, y = %d\n", x, y);
return 0;
}
函数递归:函数递归是指函数在执行过程中调用自身。递归需要有明确的终止条件,否则会导致无限递归,最终使程序崩溃。例如,使用递归计算阶乘:
#include
int factorial(int n) {
if (n == 0 || n == 1) {
return 1;
}
return n * factorial(n - 1);
}
int main() {
int num = 5;
printf("%d的阶乘为:%d\n", num, factorial(num));
return 0;
}
五、数组与指针
多维数组:除了一维数组,C 语言还支持多维数组,如二维数组常用于表示矩阵。二维数组的定义方式为数据类型 数组名[行数][列数],例如int arr[3][4];表示一个 3 行 4 列的二维整型数组。访问二维数组元素使用arr[i][j],其中i表示行下标,j表示列下标,均从 0 开始。例如,初始化并输出一个 3 行 3 列的二维数组:
#include
int main() {
int arr[3][3] = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
printf("%d ", arr[i][j]);
}
printf("\n");
}
return 0;
}
指针与数组:数组名本质上是一个指向数组首元素的常量指针,因此可以通过指针来访问数组元素。例如,使用指针遍历数组:
#include
int main() {
int arr[] = {1, 2, 3, 4, 5};
int *p = arr;
for (int i = 0; i < 5; i++) {
printf("%d ", *(p + i));
}
return 0;
}
掌握以上 C 语言基础知识,你就可以开始编写简单的 C 语言程序!