云计算百科
云计算领域专业知识百科平台

C语言(1)

计算机基础

计算机的组成
计算机的定义

计算机:能进行计算及逻辑处理的设备。

硬件:组成计算机的物理部件(硬盘,内存条,CPU等)

​开发中对于硬件的认知:硬件包括电子设备、单片机、集成电路和嵌入式系统。

软件:计算机中运行的程序和数据

​开发中对于软件的认知:软件分为系统软件(OS)、应用软件、编程工具(编译器)

计算机的六大部件

中央处理器(CPU):负责控制指令执行和数据计算。

内存:临时存储程序运行时的指令和数据。

输入设备:向计算机输入数据(鼠标,键盘,扫码枪等)。

输出设备:将计算机处理结果输出(显示器,打印机等)。

外存设备:永久存储数据(硬盘,U盘等)。

网络:实现设备间数据的传输和通讯。

计算机工作原理

存储程序:程序和数据预先存储在内存里。

程序控制:CPU按照指令顺序逐条执行操作。

计算机工作语言
语言类型特点示例
机器语言 二进制代码,可直接控制硬件,执行效率最高 1011110 010100010
汇编语言 用助记符表示机器指令,需通过汇编器翻译为机器语言 MOV AL, 61h0、
高级语言 贴近人类自然语言,可读性强,需要编译/解释执行 printf(“hello world”)

C语言程序的开发过程

开发的三个步骤

①编辑:程序员编写源程序 .c文件。

②编译:编译器将源代码转换为可执行的二进制指令文件。

③运行:操作系统加载并执行可执行二进制程序。

C语言程序的编译过程

上面提到编译分为四个步骤:

预处理

预处理:软件分为系统软件(OS)、应用软件、编程工具(编译器):处理宏定义(#define),头文件包含(#include)、注释等,将头文件内容直接拷贝到当前文件。预处理需要用到预处理器。

命令:gcc -E *.c -o *.i

文件类型转换:*.c → *.i

说明:生成预处理后的C代码(文本文件)

yueqian@yueqian-vm:~$ gcc -E deom1.c -o deom1.i
yueqian@yueqian-vm:~$ cat deom1.i

编译

编译:对预处理后的代码进行语法分析,语义检查,生成汇编语言代码。编译要用到编译器。

命令:gcc -S *.c -o *.s

文件类型转换:.i/.c → *.s

说明:生成汇编代码(文本文件)

yueqian@yueqian-vm:~$ gcc -S deom1.i -o deom1.s
yueqian@yueqian-vm:~$ cat deom1.s

汇编

.汇编:将汇编代码转换为二进制代码,生成目标文件。汇编要用到汇编器。

命令:gcc -c *.s -o *.o

文件类型转换:*.s → *.o

说明:将汇编代码转为二进制目标文件(注:gcc -c *.c 等价于预处理+编译+汇编三步)

yueqian@yueqian-vm:~$ gcc -c deom1.s -o deom1.o
yueqian@yueqian-vm:~$ cat deom1.o

链接

链接:将目标文件与系统库文件、其他目标文件合并,生成可执行文件。链接要用到链接器。

命令:gcc *.c -o *

文件类型转换:*.o →可执行文件

说明:生成可执行二进制文件

C语言程序的基本结构

一个简单的C语言程序

功能:在控制台(终端)输出“Hello World!”

/*************************************************************************
> File Name: deom1.c
> Author: 蒋文辉
> Description:
> Created Time: 2026年07月28日 星期二 19时34分38秒
************************************************************************/

#include <stdio.h>//引入输入输出标准库头文件,printf()需要这个头文件

//主函数:一个*.c有且仅有1个主函数,作为程序的入口,这个函数在程序运行后自动执行
int main(int argc,char *argv[])
{
//C标准库提供的函数:向控制台输出Hello World,\\n是换行的意思,需要引用<stdio.h>
printf("Hello World\\n");
return 0;
}

#运行结果
yueqian@yueqian-vm:~$ ./a.out
Hello World

程序结构分析

①注释:用于解释代码逻辑,仅给程序员阅读。注释在编译的早期翻译阶段(预处理)被替换为空格,不参与后续编译。

②预处理指令:以 # 开头,用于包含头文件、宏定义等,如 #include <stdio.h> , #define PI 3.1415926。

③主函数( main 函数):程序的唯一入口,由操作系统通过程序启动机制自动调用,不能被程序员自定义函数调用。

④函数组成:

​– 函数头:说明函数的返回值类型、函数名和参数列表。在C语言中, int main(void) 明确表示无参数,int main() 表示参数未指定(与C++不同,C中二者语义有区别)。若无参数,建议统一使用 intmain(void) 或 int main(int argc, char *argv[])

​– 函数体:用 {} 括起来,包含变量声明和语句执行的部分(语句以 ; 结尾)

⑤函数调用语句:调用已定义的函数(如: printf ,是标准库中的输出函数)

C语⾔编程规范

C语言编程需要遵循以下规范,提升代码的可读性和可维护性

缩进格式

推荐缩进4个空格(或配置编辑器将Tab键显示宽度设为4个字符),统一代码层级。

⾜够注释

对于关键代码(如函数功能、复杂逻辑、变量含义)添加注释。

合适空⾏

预处理指令与函数之间、函数与函数之间、全局变量与函数之间添加空行,区分代码模块:

/*************************************************************************
> File Name: deom1.c
> Author: 蒋文辉
> Description:
> Created Time: 2026年07月28日 星期二 20时10分45秒
************************************************************************/

// 包含头文件,预处理时,会将对应的.h文件代码全部拷贝到当前文件位置
#include <stdio.h>
#include <stdlib.h>

// 宏定义:预处理阶段,会使用宏值替换掉宏名称,称作宏展开
#define R 2 // 定义一个半径
#define PI 3.1415926

int main(int argc,char *argv[])
{
//向控制台输出Hello World
printf("Hello World\\n");

// 计算圆的面积
double area = PI * R * R; // 预处理后:double area = 3.1415926 * 2 * 2

printf("%lf\\n", area);

return 0;
}

#运行结果
yueqian@yueqian-vm:~$ ./a.out
Hello World
12.566370

{}对⻬

推荐(C/C++风格)

int fun()
{
...
}

分层缩进与模块化

函数体内的代码按逻辑层次缩进,复杂逻辑拆分模块化:

int func()
{
if (..)
{
for (..)
{
printf("hello\\n");
}
}
if (..)
{
for (..)
{
printf("hello\\n");
}
}
}

单句单⾏

不将多条语句写在同一行

int main()
{
// 不推荐的写法
printf("第1行\\n"); printf("第2行\\n"); printf("第3行\\n");
// 推荐的写法
printf("第1行\\n");
printf("第2行\\n");
printf("第3行\\n");
}

标识符命名

函数名、变量名等都叫标识符,命名要见名知意,使用英文单词或短语,避免无意义的字母

int main()
{
// 不推荐的写法
int a = 21;
int b = 168;
int c = 190;
// 推荐的写法
int age = 21; // 年龄:21
int height = 168; // 身高:168
int weight = 190; // 体重:190
return 0;
}

C语⾔中的注释

C语言注释分为单行注释和多行注释,作用是解释代码、屏蔽临时无用代码、不参与编译(在预处理阶段删除)。

单⾏注释

格式:用 // 开头,注释从 // 到行尾

适用场景:变量说明、常量说明、函数调用语句、简单逻辑注释

// 注释内容

// 预处理指令:引入系统标准输入输出库(printf函数需要用到)
#include <stdio.h>
int main()
{
// 向控制台输出 hello world! \\n是换行符,必须写在 "\\n" 内部
printf("hello world!\\n");

return 0;
}

多⾏注释

格式:用 /* 开头,以 */ 结尾,可单行,可跨多行,不能嵌套

适用场景:文件头说明、函数功能说明、复杂代码块注释

/* 注释内容 */

/*
注释内容
注释内容
*/

/*
函数名:main
功能:程序入口,输出hello world!
返回值:0-表示程序正常结束
*/

int main()
{
...
}

⽂档注释

文档注释本质上还是多行注释,用于生成标准化文档,格式更加规范,一般替代传统的多行注释。

/**
* @brief 函数名:main
* @author 开发者姓名
* @date 开发时间
* @param argc 解释参数
* @param argv 解释参数
* @return 返回值说明
*/

int main(int argc, char* argv[])
{
...

return 0;
}

数据类型

数据类型决定了数据在内存中如何存储?需要多大空间?

数据:计算机需要处理的信息(数字、文字、符号、图片、音视频等),程序运行时所有数据都需要加载到内存中。

数据类型分类
基本类型(内置类型)

​– 整型(数值类型,存储整数)

​ 短整型: short ( short int 的表示),2个字节

​基本型: int (使用频率最高),4个字节

​长整型: long ( long int 的表示),32位系统4字节,64位系统8字节

​长长整型: long long ( long long int ,C99新增标准)

​– 浮点型(数值类型,存储小数/实数)

​单精度型: float ,4个字节

​双精度型: double ,8个字节

​长双精度型: long double

​– 字符型: char (存储单个字符,本质是ASCII码值),1个字节

构造类型(用户基于C语言语法定义)
指针类型(存储内存地址)
空类型

void (表示无类型,用于函数返回值,函数形参,指针类型),举例: main(void) 等价于 main()

数据类型在内存中的大小
数据类型中文说明大小(字节)常见取值范围
short 短整型 2 -32768~32767
int 基本整型 4 -2147483648 ~ 2147483647
long 长整型 4(32位系统)/8(64位系统) 32位:同int;Linux 64位:-9223372036854775808 ~9223372036854775807;Windows 64位:同32位(-2147483648 ~ 2147483647)
long long 长长整型 8 -9223372036854775808 ~ 9223372036854775807
float 单精度浮点型 4 约 ±3.4×10³⁸(精度 6~7 位有效数字)
double 双精度浮点型 8 约 ±1.7×10³⁰⁸(精度 15~16 位有效数字)
char 字符型 1 -128 ~ 127(有符号)/ 0 ~ 255(无符号)
bool(_Bool,C99新增) 布尔型 1 true(非 0)、false(0)

注意: 计算机存储最小单位是 bit (位),1个 bit 仅能存储0或1;程序中最小操作单位是 Byte (字

节),1字节 = 8位;C语言中没有 Byte 这个单位,我们使用 char 表示字节。也就是 1 char =

8 bit 。

sizeof运算符使用示例

sizeof运算符,用来计算数据类型或者变量的大小,返回的是字节数

/*************************************************************************
> File Name: demo01.c
> Author: 蒋文辉
> Description:
> Created Time: 2026年07月29日 星期三 17时25分31秒
************************************************************************/

#include <stdio.h>

int main(int argc,char *argv[])
{
printf("int的大小=%ld字节\\n", sizeof(int));
printf("double的大小=%ld字节\\n", sizeof(double));

return 0;
}

#运行结果
int的大小=4字节
double的大小=8字节

总结:

① 数据类型的字节大小与C语言编译系统(32位/64位)、操作系统相关;

② sizeof 是运算符(非函数),计算结果为无符号整数(只有正整数,没有负整数);

常量

常量是程序执行过程中值不可改变的量,与变量一样需要用到内存空间存储。

整型常量

整型常量有十进制、八进制、十六进制三种表示形式;

表示形式
十进制常量

​– 组成:数字 0~9 ,不能以 0 开头, 0 自身除外

​– 注意:不能表示小数

​– 示例:正确写法: 99 , 298, 0

​ 错误写法: 06 , 000

八进制常量

​– 组成:数字 0~7 ,以0为前缀(不可省略)

​– 注意:不能表示小数

​– 示例:正确写法: 03 , 062 , 000

​ 错误写法: 039 , 255

十六进制常量

​– 组成: 0~9 + a~f / A~F ,以 0x/0X 为前缀

​– 注意:不能表示小数

​– 示例: 0xFFAEFBF 、 0X123 、 0x0 /0x00000000

后缀说明

长整型常量:在数值后加 L/l ,推荐用 L

示例: long num = 123L 明确指定为长整型,此时的 L 只起到一个标识作用,数值依然是 123

有符号和无符号

有符号(默认):表示范围为 负数 + 0 + 正数 ,如 char 的有效范围是 -128~127 ,可以在类型前添加修饰关

键字 signed ,一般省略。

// 以下两行代码完全等价
signed int a = 10086;
int a = 10086;

无符号:表示范围 0 + 正数 (内存中负数位用来存储正数,正数范围更大),如 char 的无符号范围是

0~255 ,需要再类型前添加修饰关键字 unsigned 。

unsigned char num = 100; // 只能存储 0 ~ 255

char(有符号)范围:-128~127

char(无符号)范围:0~255

浮点型常量

浮点型常量(小数/实数)有两种表示方式:

十进制小数形式

组成:数字 0~9 ,小数点 . ,必须包含小数点(即使整数部分为0或小数部分为0)

示例: 0.123 (double,默认) / 0.123F (float)、 -12.6 、 3.0 、 0.0

注意:

​– float 类型常量需要在末尾添加 F/f ,默认浮点型常量为 double 类型。

​– 示例: float f = 0.12F (明确指定为单精度浮点型)

指数形式(科学计数法)

格式: 数字 e/E整数指数 , e/E 表示10的幂次。

示例:

​– 正数: 12345.67→1.234567*10^4→1.23467e+4或1.234567e4(十进制小数形式 → 指数形式)

– 负数: 0.0147→1.47*10^2→1.47e-2(十进制小数形式 → 指数形式)

注意:

​– e/E 前面必须有数字( 0~9 ),其中小数点前的整数部分取值范围为 1~9 (前导零 0 在数值上无意义,但C语法允许)

​– e/E 后面必须是整数(不能带小数),错误示例: 1.2345e3.5

​– 单精度常量需要加 f/F ,如 1.2345e3F (float)、 1.2345e3 (double,默认)

字符型常量
普通字符常量

格式:用单引号 ‘’ 括起来的单个字符。英文输入法下的字母、数字、符号等ASCII规范的字符。

示例:

​– 正确示例:如 ‘a’ , ‘A’ , ‘5’ , ‘_’ , ‘+’ , ‘\\n’

​– 错误示例:如 ‘软’ , “a”

本质:硬件存储的是ASCII规范的字符的ASCII码值,如 a 的ASCII码值为 97 , A 的ASCII码值为 65 ,数字为48

转义字符常量

以反斜杠 \\ 开头的特殊的字符序列,用于表示控制字符或不可见字符(如换行符、制表符),常见转义符如下:

字符形式ASCII码中文解释用途
'\\n' 10 换行 光标移动至下一行开头
'\\r' 13 回车 光标移动至当前行开头
'\\0' 0 空字符 字符串结束标志(重要)
'\\t' 9 水平制表符 相当于按Tab键(8个空格)
'\\\\' 92 反斜杠 表示字符 \\
'\\'' 39 单引号 表示字符 '
'\\"' 34 双引号 表示字符 "

在 Linux 终端输入 man ascii 可查看所有 ASCII 字符及对应码值。

字符串常量
定义

用双引号""括起来的字符序列(可包含多个字符、数字、符号),C语言无内置的字符串类型,字符串常量和变量均需要通过字符数组或者字符指针来实现。字符串常量末尾自动添加\\0 结束标记,但是这个标志是看不见的,也不会显示输出。

示例

"How are you ? " // 实际存储:How are you ? \\0
"hello world" // 实际存储:hello world\\0
"123456" // 实际存储:123456\\0
"" // 实际存储:\\0

输出

通过printf函数的%s格式输出:

printf("hello world!\\n"); // 推荐,内部补充%s
// 等价于
printf("%s", "hello world!\\n");

与字符常量的区别
对比项字符常量(如:‘a’)字符串常量(如:“a”)
定界符 单引号 '' 双引号 ""
内存占用 1字节(存储ASCII码) 2字节('a' + '\\0')
结束标志 自动添加 \\0,字符串结束标志
表示范围 仅单个字符 可多个字符或空

关键:字符串常量末尾会被系统自动添加 \\0,用于标识字符串结束,这是字符串与字符常量的核心区别。

符号常量(无参宏定义)

定义

通过预处理指令#define定义的标识符,用于代表一个固定常量(预处理阶段,会直接替换成宏值)

优点

增强代码的可读性(用有意义的标识符代替魔法数字)

提升代码的可维护性(需修改常量时,仅需要修改宏定义,无需逐个修改代码)

语法格式

#define 宏名称 宏值

注意事项

① 宏名称与宏值之间用空格隔开;

② 行末不能加;(否则替换是会带入分号,导致语法错误)

③ 宏名称命名规范:字母(A~Za~z)+ 数字(0~9)+ 下划线(_),不能以数字开头。习惯上宏名使用全大写(如MAX_VALUE),小写字母也合法但较少用于宏(如max_value)

示例代码

源程序:

/*************************************************************************
> File Name: demo03.c
> Author: 蒋文辉
> Description:
> Created Time: 2026年07月29日 星期三 19时01分30秒
************************************************************************/

#include <stdio.h>

// 定义PI
// 语法:#define 全大写宏名 宏值
#define PI 3.1415926

int main(int argc,char *argv[])
{
// 实现一个圆的面积计算
// 创建一个变量,用来存放圆的半径
double r = 10;
// 计算圆的面积
double area = PI * r * r;

printf("圆的面积是:%f\\n", area);

// 计算圆的周长
double c = 2 * PI * r;
printf("圆的周长是:%f\\n", c);

return 0;
}

预处理后:

...
# 14 "demo03.c"
int main(int argc,char *argv[])
{

double r = 10;

double area = 3.1415926 * r * r;

printf("圆的面积是:%f\\n", area);

double c = 2 * 3.1415926 * r;
printf("圆的周长是:%f\\n", c);

return 0;
}

运行结果:

yueqian@st-vm:/mnt/hgfs/Code/20260729$ gcc demo03.c
yueqian@st-vm:/mnt/hgfs/Code/20260729$ ./a.out
圆的面积是:314.159260
圆的周长是:62.831852

赞(0)
未经允许不得转载:网硕互联帮助中心 » C语言(1)
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!