一、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 &lt;&lt; 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 的指针,可以转换为任何数据类型。
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐