系列文章目录
1 运算符
1.1 算术运算符:
常用的算术运算符包括加+、减-、乘*、除/、余数%。
关系运算符:
比较两个值的关系,如等于==、不等于!=、大于>、小于<等。
逻辑运算符:
用于计算布尔表达式结果,如与&&、或||、非!。
2 控制语句
2.1 条件语句:
if:根据条件执行代码块。
else if 和 else:提供多个条件分支。
switch:基于单一变量的多个可能值进行分支。
示例:
- if (age >= 18) {
- printf("成年人\n");
- } else {
- printf("未成年人\n");
- }
复制代码
2.2 循环语句:
for:适合已知次数的循环(如:
- for (int i = 0; i < 5; i++) {
- printf("%d ", i);
- }
复制代码
while:适合未知次数的循环,基于条件(如:
- int i = 0;
- while (i < 5) {
- printf("%d ", i);
- i++;
- }
复制代码
do…while:至少执行一次的循环形式(如:
- int i = 0;
- do {
- printf("%d ", i);
- i++;
- } while (i < 5);
复制代码
跳转语句:
break:终止循环或switch结构。
continue:跳过当前循环的剩余部分,继续下一次循环。
return:结束函数并返回值。
3 函数
3.1 函数的定义与声明:
函数声明(原型)一般放在文件顶部,定义在文件底部(如:
- int add(int a, int b); // 函数声明
- int add(int a, int b) { // 函数定义
- return a + b;
- }
复制代码
参数传递:
值传递:将参数的副本传入函数。
引用传递:通过指针传递,直接修改原始数据。
3.2 递归函数:
一个函数在其定义中调用自己。递归通常需要一个基准条件来避免无限循环。
示例:计算阶乘的递归函数
- int factorial(int n) {
- if (n == 0) {
- return 1; // 基准条件
- } else {
- return n * factorial(n - 1); // 递归调用
- }
- }
复制代码
4 指针
4.1 指针的定义与使用
指针是一个变量,用于存储另一个变量的地址(如:
- int a = 10;
- int *p = &a; // p存储a的地址
复制代码
访问指针所指向的值可以使用解引用操作符*(如:printf(“%d\n”, *p);)。
指针与数组:
数组名实际上是指向数组第一个元素的指针(如:int arr[5]; int *ptr = arr;)。
动态内存分配:
使用malloc和free管理动态内存:
- int *arr = (int*)malloc(5 * sizeof(int)); // 动态分配内存
- free(arr); // 释放内存
复制代码
函数指针:
可以将函数的地址赋给指针,使用该指针调用函数(如:
- void (*funcPtr)(int) = &myFunction;
- funcPtr(5);
复制代码
5. 数组与字符串
5.1 数组
一维数组:相同类型元素的集合(如:
- int arr[5] = {1, 2, 3, 4, 5};
复制代码
多维数组:数组的数组(如:
- int matrix[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
复制代码
字符串:
字符串在C语言中实际上是字符数组,以空字符\0结束(如:
- char str[20] = "Hello";
- 常用字符串处理函数:
- strlen():计算字符串长度。
- strcpy():复制字符串。
- strcmp():比较两个字符串。
复制代码
6 结构体与联合体
6.1 结构体
用于封装不同类型的数据(如:
c
struct Student {
char name[50];
int age;
float grade;
};
struct Student s1 = {“Alice”, 20, 85.5};
联合体
允许在同一内存位置存储不同类型的数据,但只能使用一个(如:
- union Data {
- int i;
- float f;
- char str[20];
- };
- union Data data;
- data.i = 10; // 只会存储这个值
复制代码
7 .文件处理
7.1 文件的打开与关闭:
使用fopen打开文件,使用fclose关闭文件(如:
- FILE *fp = fopen("file.txt", "r");
- fclose(fp);
复制代码
读写文件:
fprintf():格式化写入文件。
fscanf():从文件读取格式化输入。
示例:
- FILE *fp = fopen("file.txt", "w");
- fprintf(fp, "Hello, World!\n");
- fclose(fp);
复制代码
错误处理:
检查文件是否成功打开(如:
- if (fp == NULL) {
- perror("Error opening file");
- }
复制代码
8 预处理指令
8.1 头文件包含
使用#include指令引入标准库或用户自定义的头文件(如:
- #include <stdio.h>
- #include "myheader.h"
复制代码
宏定义:
使用#define创建常量或宏函数(如:
- #define PI 3.14
- #define SQUARE(x) ((x) * (x))
复制代码
条件编译
使用#ifdef、#ifndef、#if、#else、#elif和#endif来控制代码的编译。
示例:
- #define DEBUG
- #ifdef DEBUG
- printf("Debug mode\n");
- #else
- printf("Release mode\n");
- #endif
复制代码
文件包含:
#include用于引入头文件,可以是标准库或自定义的头文件。使用尖括号<>表示系统头文件,使用双引号""表示用户自定义头文件。
- #include <stdio.h> // 系统头文件
- #include "myfile.h" // 用户自定义头文件
复制代码
9 错误处理与调试
9.1 错误处理
C语言使用返回值和全局变量errno来处理运行时错误。通过检查函数调用的返回值来判断是否发生了错误。
使用perror()函数:
可以打印出错误信息,通常用于文件操作失败后。
- FILE *fp = fopen("nonexistent.txt", "r");
- if (fp == NULL) {
- perror("Error opening file");
- }
复制代码
调试技巧:
使用assert()宏进行断言检查,确保程序在运行时满足特定条件。
- #include <assert.h>
- assert(x > 0); // 如果x不大于0,程序将终止,并显示错误信息
复制代码
10 C语言标准库
常用标准库:
:输入输出操作。
:内存管理、随机数生成等。
:字符串处理。
:数学计算,例如三角函数、对数等。
11 程序结构与风格
11.1 程序结构:
C语言程序一般由多个功能模块组成,每个模块可以用函数实现,主函数main()是程序的入口点。
良好的编程风格:
使用有意义的变量名。
保持一致的缩进风格和代码布局。
添加注释以提高代码可读性。
将复杂逻辑分解为简单的函数。