C-Primer-Plus-第二章-C语言概述
第二章 C语言概述
参考书籍:C Primer Plus(第6版)中文版
一、前言
打算跟这本书系统地学习一遍C语言,谨以此系列文章记录自己的学习之路。本文所有图片均来源于此书。
二、主要内容
1. C程序组成

2. C程序示例
#include <stdio.h>
int main(void) /* 一个简单的C程序 */
{
int num; /* 定义一个名为num的变量 */
num = 1; /* 为num赋一个值 */
printf("I am a simple"); //使用printf函数
printf("computer.\n");
printf("My favorite number is %d because it is first.\n",num);
return 0;
}
2.1 快速概要
- C程序包含一个或多个函数 ,它们是C程序的基本模块。
- 程序中有一个名为
main()
的函数。圆括号表明main()
是一个函数名。int
表明main()
函数返回一个整数,void
表明main()
不带任何参数。 int
和void
是标准ANSI C定义main()
的一部分。
- 程序中有一个名为
- 注释在
/*
和*/
两个符号之间,这些注释能提高程序的可读性。- 注释只是为了帮助读者理解程序,编译器会忽略它们。
- 该程序使用使用
printf()
函数,在程序中使用函数叫作调用函数 。 - 代码
\n
告诉计算机另起一行,即把光标移至下一行。 %d
告诉计算机以何种形式输出num
的值,打印在何处。- C函数可以给调用方提供(或返回)一个数,这里
return
语句的作用。
2.2 程序细节
#include
指令和头文件#include <stdio.h>
的作用相当于把stdio.h
文件中的所有内容都输入该行所在的位置。- 这是一种“拷贝-粘贴”的操作。
include
文件提供了一种方便的途径共享许多程序共有的信息。 - 所有的C编译器软件包都提供
stdio.h
文件。该文件中包含了供编译器使用的输入和输出函数(如,printf()
)信息。该文件名的含义:standard input/output file - 通常,在C程序顶部的信息集合被称为头文件 (header)。头文件中可以定义一些常量,或者指明函数名以及如何使用它们。头文件包含了编译器创建最终可执行程序要用到的信息。
- #include中的#符号表明,C预处理器在编译器接手之前处理这条指令,这属于预处理器指令。
main()
函数- C程序一定从
main()
函数开始执行(目前不必考虑例外的情况) - 函数是C程序的基本模块
int
是main()
函数的返回类型。这表明main()
函数返回的值是整数。返回到哪里?返回给操作系统。- 通常,函数名后面的圆括号中包含一些传入函数的信息。
- C程序一定从
- 注释
- 在程序中,被
/* */
两个符号括起来的部分是程序的注释。在/*
和*/
之间的内容都会被编译器忽略。 - C99新增了另一种风格的注释,普遍用于C++和Java。这种新风格使用
//
符号创建注释,仅限于单行。
- 在程序中,被
- 花括号、函数体和块
- 一般而言,所有的C函数都使用花括号标记函数体的开始和结束。
- 花括号还可用于把函数中的多条语句合并为一个单元或块,类似于Pascal这些语言中的
begin
和end
。
- 声明
int num;
这行代码叫作声明 (declaration)。- 声明是C语言最重要的特性之一。
- 在该例中,声明完成了两件事。
- 其一,在函数中有一个名为
num
的变量 (variable)。 - 其二,
int
表明num
是一个整数(integer)(即,没有小数点或小数部分的数)。
- 其一,在函数中有一个名为
int
是C语言的一个关键字 (keyword),表示一种基本的C语言数据类型。- 关键字是语言定义的单词,不能做其他用途。
- 示例中的
num
是一个标识符 (identifier),也就是一个变量、函数或其他实体的名称。- 声明把特定标识符与计算机内存中的特定位置联系起来,同时也确定了储存在某位置的信息类型或数据类型。
- 在C语言中,所有变量都必须先声明才能使用。
- 以前的C语言,还要求把变量声明在块的顶部,其他语句不能在任何声明的前面。C99和C11遵循C++的惯例,可以把声明放在块中的任何位置。
- 数据类型
- C语言可以处理多种类型的数据,如整数、字符和浮点数。
- 把变量声明为整型或字符类型,计算机才能正确地储存、读取和解释数据。
- 命名
- 给变量命名时要使用有意义的变量名或标识符。
- C99和C11允许使用更长的标识符名,但是编译器只识别前63个字符。
- 如果两个标识符都是64个字符,只有最后一个字符不同,那么编译器可能将其视为同一个名称,也可能不会。标准并未定义在这种情况下会发生什么。
- 可以用小写字母、大写字母、数字和下划线(_)来命名。而且,名称的第1个字符必须是字母或下划线,不能是数字。
- C语言的名称区分大小写,即把一个字母的大写和小写视为两个不同的字符。因此,
stars
和Stars
、STARS
都不同。
- 声明变量的4个理由
- 把所有的变量放在一处,方便读者查找和理解程序的用途。
- 声明变量会促使你在编写程序之前做一些计划。
- 程序在开始时要获得哪些信息?希望程序如何输出?表示数据最好的方式是什么?
- 声明变量有助于发现隐藏在程序中的小错误,如变量名拼写错误。
- 如果事先未声明变量,C程序将无法通过编译
- 在我地盘这 你就得听我的 把程序收割 用代码找快乐^ ^
- 赋值
num = 1;
程序清单中的这行代码是赋值表达式语句。- 可以给
num
赋不同的值,这就是num
之所以被称为变量 (variable)的原因
printf()
函数- C语言的一个标准函数:
printf()
。 - 圆括号表明
printf
是一个函数名。圆括号中的内容是从main()
函数传递给printf()
函数的信息。该信息被称为参数 ,或者更确切地说,是函数的实际参数 (actual argument)。 - 在C语言中,实际参数(简称实参)是传递给函数的特定值,形式参数(简称形参)是函数中用于储存值的变量。
- C语言的一个标准函数:
\n
组合\n
组合(依次输入这两个字符)代表一个换行符 (newline character)。- 换行符是一个转义序列 (escape sequence)。
- 转义序列用于代表难以表示或无法输入的字符,如,
\t
代表Tab 键,\b
代表Backspace 键(退格键)。每个转义序列都以反斜杠字符(\)开始。
- 转义序列用于代表难以表示或无法输入的字符,如,
%d
占位符%
提醒程序,要在该处打印一个变量,d
表明把变量作为十进制整数打印。printf()
函数名中的f
提醒用户,这是一种格式化打印函数。
- return语句
- 有返回值的C函数要有
return
语句。 int
main(void)
中的int
表明main()
函数应返回一个整数。C标准要求main()
这样做。- 如果遗漏
main()
函数中的return
语句,程序在运行至最外面的右花括号}
时会返回0
。
- 有返回值的C函数要有
3. 简单程序的结构
C程序的基本结构:程序由一个或多个函数组成,必须有main()
函数。函数由函数头和函数体组成。
- 函数头 包括函数名、传入该函数的信息类型和函数的返回类型。
- 函数体 被花括号括起来,由一系列语句、声明组成。

4. 提高程序可读性的技巧
- 选择有意义的函数名和写注释。
- 注意,使用这两种技巧时应相得益彰,避免重复啰嗦。如果变量名是
width
,就不必写注释说明该变量表示宽度。
- 注意,使用这两种技巧时应相得益彰,避免重复啰嗦。如果变量名是
- 在函数中用空行分隔概念上的多个部分。
- C语言并未规定一定要使用空行,但是多使用空行能提高程序的可读性。
- 每条语句各占一行。
- C语言的格式比较自由,可以把多条语句放在一行,也可以每条语句独占一行。
- 分号告诉编译器一条语句在哪里结束、下一条语句在哪里开始。
5. 多个函数
/*two_func.c -- 一个文件中包含两个函数*/
#include <stdio.h>
void butler(void); /* ANSI/ISO C函数原型 */
int main(void)
{
printf("I will summon the butler function.\n");
butler();
printf("Yes. Bring me some tea and writeable DVDs.\n");
return 0;
}
void butler(void)
{
printf("You rang,sir?\n");
}
butler()
函数在程序中出现了3次。
- 第1次是函数原型 (prototype),告知编译器在程序中要使用该函数。
- 注意,
void
在这里的意思是“空的”,而不是“无效”。 - 例如,
butler()
函数原型中的第1个void
表明,butler()
函数没有返回值。
- 注意,
- 第2次以函数调用(function call)的形式出现在
main()
中。 - 第3次出现在函数定义(function definition)中,函数定义即是函数本身的源代码。
- C90标准新增了函数原型。函数原型是一种声明形式,告知编译器正在使用某函数,因此函数原型也被称为函数声明 (function declaration)。
- 记住,无论
main()
在程序文件处于什么位置,所有的C程序都从main()
开始执行。但是,C的惯例是把main()
放在开头,因为它提供了程序的基本框架。 - C标准建议,要为程序中用到的所有函数提供函数原型。
- 标准
include
文件(包含文件)为标准库函数提供了函数原型。例如,在C标准中,stdio.h
文件包含了printf()
的函数原型。
- 标准
6. 调试程序
- 语法错误
- 如果不遵循C语言的规则就会犯语法错误 ,这类似于英文中的语法错误。
- C语言的语法错误指的是,把有效的C符号放在错误的地方。
- 语义错误
- 编译器无法检测语义错误,因为这类错误并未违反C语言的规则。编译器无法了解你的真正意图,所以你只能自己找出这些错误。
- 解决这类错误的方法之一是,把自己想象成计算机,跟着程序的步骤一步一步地执行。
- 程序状态
- 程序状态(program state)是在程序的执行过程中,某给定点上所有变量值的集合,它是计算机当前状态的一个快照。
- 跟踪程序状态的方法
- 自己模拟计算机逐步执行程序。
- 在程序中的关键点插入额外的
printf()
语句,以监视制定变量值的变化。 - 使用调试器,调试器(debugger)是一种程序,让你一步一步运行另一个程序,并检查该程序变量的值。
7. 关键字和保留标识符
关键字是C语言的词汇。它们对C而言比较特殊,不能用它们作为标识符(如,变量名)。许多关键字用于指定不同的类型,如int
。还有一些关键字(如,if
)用于控制程序中语句的执行顺序。
在下表中所列的C语言关键字中,粗体表示的是C90标准新增的关键字,斜体 表示的C99标准新增的关键字,粗斜体 表示的是C11标准新增的关键字。

8. 关键概念
- 程序员要具备抽象和逻辑的思维,并谨慎地处理细节问题。
- 可以把程序看作是你希望计算机如何完成任务的描述。
9. 本章小结
- C程序由一个或多个C函数组成。
- 每个C程序必须包含一个
main()
函数,这是C程序要调用的第1个函数。
- 每个C程序必须包含一个
- 简单的函数由函数头和后面的一对花括号组成,花括号中是由声明、语句组成的函数体。
- 声明语句为变量指定变量名,并标识该变量中储存的数据类型。
- 编译器可以检测出语法错误,但是程序的语义错误只有编译完之后才能从程序的行为中表现出来。
- 检查程序是否有语义错误要跟踪程序的状态,即检查程序每执行一步后所有变量的值。
- 关键字是C语言的词汇。
10. 译者注
- C语言是通过赋值运算符而不是赋值语句完成赋值操作。根据C标准,C语言并没有所谓的“赋值语句”,本书及一些其他书籍中提到的“赋值语句”实际上是表达式语句(C语言的6种基本语句之一)。本书把“赋值语句”均译为“赋值表达式语句”,以提醒初学者注意。
- 在C语言中,return语句是一种跳转语句。
- 历年的C标准中从来没有函数调用语句!值得一提的是,函数调用本身是一个表达式,圆括号是运算符,圆括号左边的函数名是运算对象。在C11标准中,这样的表达式是一种后缀表达式。在表达式末尾加上分号,就成了表达式语句。请初学者注意,这样的“函数调用语句”实质是表达式语句。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!