C语言学习笔记
计算机语言基础见计算机语言基础知识
以 gcc 为例。编写名为 hello.c 的源文件后,编译: $ gcc hello.c 会生成一个二进制文件,默认为 a.out,这个过程就是编译。
上述 gcc 命令其实依次执行了四步操作:1.预处理(Preprocessing)、2.编译(Compilation)、3.汇编(Assemble)、4.链接(Linking)。

初识C语言
#include <stdio.h>
int main()
{
printf("Hello, world!");
return 0;
}
编译运行后,命令行会打印输出 Hello, world!。
C 程序主要包括以下部分:
- 预处理器指令
- 函数
- 变量
- 语句 & 表达式
- 注释
预处理指令和头文件
#include <stdio.h>
这段指令相当于把 stdio.h 文件中所有内容都输入该行,类似于“拷贝-粘贴”。
#include 是一条 C 预处理器指令。预处理指令通常在C编译器编译前执行,以确保程序需要。所有预处理指令都是以井号(#)开头,只有空格字符可以出现在预处理指令之前。预处理指令不是 C 语句,所以它们不会以分号(;)结尾。C 支持很多预处理指令,比如 #include、#define、#if、#else、#line 等。#include 有两种用法:尖括号引用和双引号引用,区别在于头文件的搜索路径不同。使用尖括号(<>),编译器会到系统路径下查找头文件;而使用双引号(""),编译器首先在当前目录下查找头文件,如果没有找到,再到系统路径下查找。也就是说,使用双引号比使用尖括号多了一个查找路径,它的功能更为强大。
stdio.h 是一个头文件。通常情况下,头文件以 .h 为文件后缀,包含了 C 函数声明和宏定义,被多个源文件中引用共享。头文件有两种类型:程序员编写的头文件和编译器自带的头文件。在程序中要使用头文件,需要使用 C 预处理指令 #include 来引用它。stdio.h 头文件是编译器自带的头文件。
函数
函数是一个一次执行一个或多个语句的代码块,普通函数仅在调用时执行。函数的基本形式:
dataType name(args)
{
satements...
return;
}
dataType 为返回值的数据类型,如果无返回值则为 void;name 为函数名称,除主函数外默认不执行,除非在主函数中调用;args 为传入参数,如果没有参数则为空或 void,如果有一个参数则为 argument,如果有多个参数需用 , 分隔;satements.. 表示该函数需要执行的语句,语句需要用 {} 包裹起来,看作一个代码块;return 为返回语句,其返回值类型与 dataType 一致,函数会以返回语句作为结束标志。
如果遗漏 main() 函数中的 return 语句,程序在运行至最外面的右花括号(})时会返回0。因此,可以省略 main() 函数末尾的 return 语句。但是,不要在其他有返回值的函数中漏掉它。
在C中有一个特殊的函数——主函数 main()。主函数是一个程序的入口,它由用户定义但是却必需存在,在一个项目中有且只能有一个 main() 函数,其他函数需要在 main() 函数中调用才能执行。当执行C程序时,操作系统会开始逐条执行 main() 函数中的语句直到返回语句结束。
printf() 也是一个函数,存在于 stdio.h 文件中。它的作用是打印输出字符串参数。
变量
变量其实只不过是程序可操作的存储区的名称,用于储存程序中的数据。在 C 中,每个变量都有特定的数据类型,数据类型决定了变量存储的大小和布局,该范围内的值都可以存储在内存中,运算符可应用于变量上。
变量的使用需要两个步骤:
- 声明:告知计算机变量的存在,并且建立一块指定大小的存储空间。
- 赋值:为变量赋予一个值。变量可以多次赋值,新的赋值会覆盖原有值。第一次的值也叫初始值,第一次赋值叫初始化。
详细见数据类型和变量
语句和表达式
在 C 中,表达式代表值,而语句代表给计算机的指令。
在前文中多次提到语句。在函数内部是按顺序排列的一条条的指令和相关的数据,我们可以把这些指令和数据理解为我们向计算机发出的命令,我们把这样的命令称为语句。为了区分一条条的语句,不至于让计算机混淆,我们在每一条语句末尾用 ; 结束,并且最好每个语句独占一行。
简单的语句就是要求计算机做出的一些简单动作,例如获取用户输入或打印输出等。当我们需要计算机完成某个复杂动作时,就需要多个语句协同组成代码块(block)来解决,代码块通常由用花括号({})括起来表示一个整体。
C语言六种基本语句是:1、表达式语句;2、标签语句;3、循环语句;4、复合语句;5、跳转语句;6、选择语句。C程序中的语句一般都是按照其出现的先后顺序依次执行的,我们把程序中语句的执行顺序称为程序的流程。程序的流程一般有三种结构,分别是顺序结构、选择结构(分支结构)、循环结构。这是C语言的基础。

对三种程序结构的说明:
- 顺序结构是语句按照其在程序中出现的先后顺序依次执行。
- 选择结构有时也被称为“分支结构”或“条件分支”,是根据若干个判断条件的成立与否,在程序执行过程中产生不同的执行分支。
- 循环结构是程序在运行过程中如果某个判断条件成立,把一些语句反复执行若干次。
表达式由运算符和操作数组成。用来处理程序中的数据,详细见数据类型和变量
注释
编译器执行语句时会默认忽略注释,因为它是供程序员阅读的。写注释是一个好习惯,这可以让程序阅读起来更加方便。
C 语言有两种注释方式:
-
单行注释
以 // 开始的单行注释,这种注释可以单独占一行。
-
多行注释
被 /* 和 */ 包裹的所有内容都被忽略,因此多行注释也可以在单行中使用,但是多行注释的首尾符号一定要匹配。如果有未匹配的注释符则会被注释掉。
// 单行注释
/*
* 多行注释
*/
数据类型和变量
数据类型
在 C 语言中,数据类型是用于声明变量或函数的一个标准,每一个值都属于某一个数据类型(data type)。当声明变量时,它决定了变量存储占用的空间,以及如何解释存储的位模式。C 中的数据类型可分为以下几种:
- 原始数据类型(Primitive Data Types):原始数据类型是最基本的数据类型,用于表示简单值,例如整数、浮点数、字符等。
- 用户定义的数据类型(User Defined Data Types):用户定义的数据类型是由用户自己定义的。
- 派生类型(Derived Types):从原始数据类型或内置数据类型派生的数据类型称为派生数据类型。
本章重点是原始数据类型,其他数据类型都是基于原始数据类型实现的。
整数类型
整数类型是原始数据类型的一种,主要用于存储整数(任何数字,包括正数、负数和不带小数部分的零)。
| 类型 | 存储大小 | 值范围 |
|---|---|---|
| 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 |
注意: long 、short、signed 和 unsigned是数据类型修饰符,可与某些原始数据类型一起使用以更改数据类型的大小或长度。
储存大小和值范围是数据类型两个重要属性,也是数据类型选择的重要依据。在我们选择数据类型时应考虑两个方面:一是数据类型的精度,二是值的范围。范围大、精度大的数据类型所占资源也会更多,如果盲目使用会减慢程序运行速度。
int 数据类型
int 数据类型是最常用的整数类型,因为它可以存储八进制值、十六进制值和十进制值。
- 范围: -2,147,483,648 至 2,147,483,647
- 大小: 4 字节
- 格式说明符: %d
整数数据类型也可以用作:
- unsigned int: C中的Unsigned int数据类型用于存储从零到正数的数据值,但它不能像signed int那样存储负值。
- Short int:它的大小比 int 小 2 个字节,因此只能存储 -32,768 到 32,767 之间的值。
- long int: int 数据类型的更大版本,因此可以存储大于 int 的值。
- unsigned Short int:与short int 的关系类似于unsigned int 与int 的关系。
char 字符类型
char 数据类型允许其变量仅存储单个字符。字符的大小为 1 个字节。它是C中最基本的数据类型。它存储单个字符,并且在几乎所有编译器中都需要单个字节的内存。
- 范围:(-128 至 127)或(0 至 255)
- 大小: 1 字节
- 格式说明符: %c
char 类型储存的值通常为单个被单引号('')包过的字符。例如:'a', '1', '中', '!' 都是一个字符。char 被归结于整数类型是因为 char 类型在内存中以整数的形式存在。字符通过 ASCII 码与整数进行转换。

假如声明一个 char 变量为 ch,并赋值为 'a',则会以数字 61 储存在内存中:
char ch = 'a';
printf("%d\n", c); // 61
printf("%c\n", c); // a
浙公网安备 33010602011771号