C语言基础知识
一、C语言基础语法
C程序的基本结构
#include <stdio.h>
int main() {
printf("Hello, World!\n");
return 0;
}
以上代码组成结构如下:
- 预处理器指令:如
#include和#define,在编译前由预处理器处理。 - 主函数:每个 C 程序都有且只有一个
main()函数,是程序的执行入口。 - 变量声明:声明程序中使用的变量,C89 要求声明必须在代码块最开头。
- 函数定义:定义程序中使用的函数,描述函数的具体实现逻辑。
头文件包含
- 头文件通常在程序的开头使用
#include指令包含。头文件提供了函数和库的声明,如标准输入输出库<stdio.h>、标准库<stdlib.h>等。它们定义了函数、宏、常量等使程序能够使用预定义的库函数。 - 系统头文件使用尖括号
<>,自定义头文件使用双引号"",两者的搜索路径不同。 - 示例:
#include <stdio.h>(系统头文件)、#include "myheader.h"(自定义头文件)
宏定义
- 宏是通过
#define指令定义的符号常量或代码片段。宏在编译前由预处理器进行文本替换,不占用运行时内存,常用于定义常量或简单的内联代码逻辑。 - 宏没有类型检查,使用时需谨慎;对于有类型要求的常量,推荐使用
const变量替代。 - 示例:
#define PI 3.14159、#define MAX(a, b) ((a) > (b) ? (a) : (b))
标识符
标识符是程序中变量、函数、数组、类型等的名字,由程序员自行定义。标识符由字母(大写或小写)、数字和下划线组成,但第一个字符必须是字母或下划线,不能是数字。
命名建议:标识符应具有描述性,能清晰表达其用途。常见的命名风格有下划线命名法(my_variable)和小驼峰命名法(myVariable),在同一项目中保持一致即可。以双下划线 __ 开头的标识符通常由编译器或标准库保留,应避免在用户代码中使用。
常量
常量是固定值,在程序执行期间不会改变。C 语言中定义常量主要有两种方式:使用 const 关键字或使用 #define 宏定义。
常量可以是整型常量、浮点型常量、字符常量、枚举常量等:
const int MAX = 100; // 整型常量
const float PI = 3.14159; // 浮点型常量
const char NEWLINE = '\n'; // 字符常量(转义字符)
字符常量中常用的转义字符包括:
'\n':换行'\t':水平制表符'\\':反斜杠'\'':单引号'\0':空字符(字符串结束标志)
使用 const 定义的常量有类型信息,编译器可以进行类型检查,相比 #define 宏更安全,是 C99 及之后推荐的方式。
字符串字面量
字符串字面量是由双引号括起来的字符序列,用于表示文本数据。
字符串字面量在内存中以字符数组的形式存储,末尾会自动添加一个空字符 \0(即 null 终止符),标志字符串的结束。
char greeting[] = "Hello, World!"; // 编译器自动计算长度(包含 \0)
以下是关于字符串字面量的几点重要说明:
- "Hello" 在内存中实际占 6 个字节:
'H'、'e'、'l'、'l'、'o'、'\0'。 - 字符串字面量存储在只读内存区域,不可修改;若需修改,应将其复制到字符数组中。
- 两个相邻的字符串字面量会被编译器自动拼接:
"Hello, " "World!"等同于"Hello, World!"。 - 字符
'A'(字符常量)和字符串"A"(字符串字面量)是不同的,后者包含'A'和'\0'两个字符。 ''非法,不能空字符""合法空字符串,内含\0
运算符(Operators)
运算符用于执行各种操作,如算术运算、逻辑运算、比较运算等。运算符作用于操作数,形成表达式并产生结果。
C 语言中的运算符种类繁多,常见的包括:
- 算术运算符:
+,-,*,/,%(其中/对整数做整除,%取余数) - 关系运算符:
==,!=,>,<,>=,<=(返回 1 表示真,0 表示假) - 逻辑运算符:
&&(与),||(或),!(非),支持短路求值 - 位运算符:
&(按位与),|(按位或),^(按位异或),~(按位取反),<<(左移),>>(右移) - 赋值运算符:
=,+=,-=,*=,/=,%=(复合赋值,如a += b等价于a = a + b) - 自增/自减运算符:
++(自增),--(自减),分前缀(先运算再取值)和后缀(先取值再运算)两种形式 - 其他运算符:
sizeof(计算类型或变量字节大小),?:(三目运算符),&(取地址),*(解引用),->(指针访问成员),.(直接访问成员)
int a = 5, b = 10;
int sum = a + b; // 算术运算符 +,sum = 15
int isEqual = (a == b); // 关系运算符 ==,isEqual = 0(假)
int result = a << 1; // 位运算左移,result = 10(相当于 a * 2)
a++; // 后缀自增,a 变为 6
int max = (a > b) ? a : b; // 三目运算符,max = b = 10
运算符具有优先级和结合性:优先级决定运算顺序,结合性决定同级运算符的运算方向。当不确定优先级时,建议使用圆括号明确分组,以提高代码可读性。
关键字
下表列出了 C 中的保留字。这些保留字不能作为常量名、变量名或其他标识符名称,它们在 C 语言中具有特定的语法含义。
| 关键字 | 说明 |
|---|---|
| auto | 声明自动变量(局部变量默认存储类型,现代 C 中很少显式使用) |
| break | 跳出当前循环或 switch 语句 |
| case | switch 语句中的分支标签 |
| char | 声明字符型变量或函数返回值类型(通常占 1 字节) |
| const | 定义只读常量,被 const 修饰的变量其值不能再被改变 |
| continue | 结束本次循环迭代,直接开始下一轮循环 |
| default | switch 语句中的默认分支(所有 case 均不匹配时执行) |
| do | do-while 循环的循环体,循环体至少执行一次 |
| double | 声明双精度浮点型变量或函数返回值类型(通常占 8 字节) |
| else | 条件语句的否定分支(与 if 连用) |
| enum | 声明枚举类型,用于定义一组命名的整型常量 |
| extern | 声明变量或函数在其它文件或本文件的其他位置定义 |
| float | 声明单精度浮点型变量或函数返回值类型(通常占 4 字节) |
| for | for 循环语句,适合已知循环次数的场景 |
| goto | 无条件跳转语句(应谨慎使用,可能降低代码可读性) |
| if | 条件判断语句 |
| int | 声明整型变量或函数返回值类型(通常占 4 字节) |
| long | 声明长整型变量或函数返回值类型 |
| register | 建议编译器将变量存入寄存器以提高访问速度(现代编译器通常自动优化) |
| return | 函数返回语句,可带返回值,也可不带(void 函数) |
| short | 声明短整型变量或函数返回值类型(通常占 2 字节) |
| signed | 声明有符号类型变量(可表示负数,整型默认有符号) |
| sizeof | 计算数据类型或变量所占的字节数(编译期运算符) |
| static | 声明静态变量(局部静态变量生命周期延续到程序结束;全局静态变量限制为文件作用域) |
| struct | 声明结构体类型,将不同类型的数据组合成一个整体 |
| switch | 多分支选择语句,根据表达式的值跳转到对应 case |
| typedef | 为已有数据类型定义新的别名,提高代码可读性 |
| unsigned | 声明无符号类型变量(只能表示非负数,范围更大) |
| union | 声明共用体类型,所有成员共享同一块内存空间 |
| void | 声明函数无返回值或无参数;也用于声明无类型指针 void* |
| volatile | 声明变量可能被程序外部因素(如硬件或中断)改变,禁止编译器优化该变量的读写 |
| while | while 循环语句,适合循环次数未知但终止条件明确的场景 |
二、数据类型
在 C 语言中,数据类型指的是用于声明不同类型的变量或函数的一个广泛的系统。变量的类型决定了变量存储占用的空间,以及如何解释存储的位模式。
C 中的类型可分为以下几种:
| 序号 | 类型与描述 |
|---|---|
| 1 | 基本数据类型 它们是算术类型,包括整型(int)、字符型(char)、浮点型(float)和双精度浮点型(double)。 |
| 2 | 枚举类型: 它们也是算术类型,被用来定义在程序中只能赋予其一定的离散整数值的变量。 |
| 3 | void 类型: 类型说明符 void 表示没有值的数据类型,通常用于函数返回值。 |
| 4 | 派生类型: 包括数组类型、指针类型和结构体类型。 |
数组类型和结构类型统称为聚合类型。函数的类型指的是函数返回值的类型。
整数类型
下表列出了关于标准整数类型的存储大小和值范围的细节:
| 类型 | 存储大小 | 值范围 |
|---|---|---|
| char | 1 字节 | -128 到 127 或 0 到 255 |
| unsigned char | 1 字节 | 0 到 255 |
| signed char | 1 字节 | -128 到 127 |
| int | 2 或 4 字节 | -32,768 到 32,767 或 -2,147,483,648 到 2,147,483,647 |
| unsigned int | 2 或 4 字节 | 0 到 65,535 或 0 到 4,294,967,295 |
| short | 2 字节 | -32,768 到 32,767 |
| unsigned short | 2 字节 | 0 到 65,535 |
| long | 4 字节 | -2,147,483,648 到 2,147,483,647 |
| unsigned long | 4 字节 | 0 到 4,294,967,295 |
注意,各种类型的存储大小与系统位数有关,但目前通用的以64位系统为主。
为了得到某个类型或某个变量在特定平台上的准确大小,您可以使用 sizeof 运算符。表达式 sizeof(type) 得到对象或类型的存储字节大小。
#include <stdio.h>
#include <limits.h>
int main()
{
printf("int 存储大小 : %lu \n", sizeof(int));
return 0;
}
浮点类型
下表列出了关于标准浮点类型的存储大小、值范围和精度的细节:
| 类型 | 存储大小 | 值范围 | 精度 |
|---|---|---|---|
| float | 4 字节 | 1.2E-38 到 3.4E+38 | 6 位有效位 |
| double | 8 字节 | 2.3E-308 到 1.7E+308 | 15 位有效位 |
| long double | 16 字节 | 3.4E-4932 到 1.1E+4932 | 19 位有效位 |
void 类型
void 类型指定没有可用的值。它通常用于以下三种情况下:
| 序号 | 类型与描述 |
|---|---|
| 1 | 函数返回为空 C 中有各种函数都不返回值,或者您可以说它们返回空。不返回值的函数的返回类型为空。例如 void exit (int status); |
| 2 | 函数参数为空 C 中有各种函数不接受任何参数。不带参数的函数可以接受一个 void。例如 int rand(void); |
| 3 | 指针指向 void 类型为 void * 的指针代表对象的地址,而不是类型。例如,内存分配函数 void *malloc( size_t size ); 返回指向 void 的指针,可以转换为任何数据类型。 |
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)