一、一些前置的小问题
我们学的是 C 语言还是 C++ 语言?
认为学的是 C 语言的:课本上写的是 C 语言,而且课上从来没提过 C++;
认为学的是 C++ 的:我们在 VS 里建工程文件的时候建的是 C++ 文件,而且文件以 .cpp 结尾。
举例:对比两门语言的 Hello World
C 语言的 Hello World:
#include <stdio.h> int main() { printf("Hello world!\n"); return 0; }C++ 语言的 Hello World:
#include <iostream> int main() { std::cout << "Hello world!" << std::endl; return 0; }
事实上:任何合法的 C 程序都是合法的 C++ 程序,C++ 是 C 语言的一个超集。因此 C 语言的 Hello World 放到 C++ 环境里同样能跑。我们在 VS 里建工程文件的时候建的是 C++ 文件就是基于这个原理。
为什么 C 语言感觉比 Python 语言复杂很多?
C 语言感觉更复杂,核心原因是它更贴近硬件、需要手动管理更多细节。Python 帮你封装了这些复杂操作,让你更加能关注于“利用编程解决问题”,而不是把精力花在“编程语言本身的特性”上。
举例:对比两门语言变量初始化
对于 C 语言:
// C int main() { int a = 1; float b = 1.5; return 0; }如果写成 Python 语言:
# Python a = 1 b = 1.5# Python 其实也可以写成这样 def main() -> int: a: int = 1 b: float = 1.5 return 0 if __name__ == "__main__": main()特点:模块化,可复用,通过插件间接实现类型检查
学习 C 语言时,一定要紧贴上学期计导课程中“信息表示”以及“计算机组成”这两部分知识点,从底层理解 C 语言。
C/C++ 语言的发展历程、C/C++ 的标准
C 语言由 Dennis Ritchie 在 1972 年于贝尔实验室开发,主要用于 UNIX 操作系统的开发。主要标准有:
- K&R C (1978)
- ANSI C / C89 (1989)
- C99 (1999)
- C11 (2011)
- C17 (2017)
C++ 由 Bjarne Stroustrup 于 1979 年在贝尔实验室开始设计开发的。作为 C 语言的增强版,C++ 进一步扩充和完善了 C 语言,是一种面向对象的程序设计语言。比较重要的标准有:
- C++98 (1998)
- C++11 (2011) – 重大更新,C++ 迈入现代
- C++20 (2020)
- C++26 草案 (2025)
但是为什么 ISO 要专门为 C/C++ 制定标准呢?这是为了保证其可移植性。(举例:条令条例)
二、程序 1:Hello World
下面是我们老生常谈的 Hello World 程序:
#include <stdio.h>
int main()
{
printf("Hello world!\n");
return 0;
}
我们就来一行一行解释。
第一行:#include
#include <stdio.h>
预处理器:#xxx
以井号 # 开头的称为预处理器。
预处理器会指定一系列的行为,相当于是给编译器安排了一些活。在编译之前,预处理器就要向编译器明确:你这个编译器需要在编译之前把我指定你干的这些活先干完了,完了以后你再去好好完成你的编译工作。
既然预处理器会指定一系列行为,那么它能让编译器干什么活呢?这就取决于 # 后面跟的是什么了。下面是一些常用的预处理器:
#include:引入头文件。#define:定义宏。#ifdef、#ifndef、#else、#endif:通常用于头文件的编写,大多数情况下是为了防止头文件被多次包含。
标准库:<xxx.h>
在标准中规定了一系列标准的库文件,以及库文件中具体要有哪些方法(函数)。在引入标准库的时候使用尖括号 <> 包裹。
- 例如:使用
#include <stdio.h>来引入标准库中的stdio.h文件
有的时候,我们还会自己去编写头文件。在引入自己写的头文件的时候使用双引号 "" 包裹。
- 例如:我编写了一个名为
hello.h的头文件,就要使用#include "hello.h"
由于我们要实现标准输入输出,我们就要借用 stdio.h 标准库。stdio.h 的意思是 Standard Input/Output Header。
第二行:main 函数
这一行代码是 main 函数的函数头:
int main()
程序的入口点
main 函数是 C 程序的入口点。当程序运行时,操作系统会调用 main 函数开始执行程序。
返回类型:int
int 表示 main 函数返回一个整数值。这个返回值通常用来表示程序的退出状态:
0表示程序成功执行- 非零值表示程序执行过程中出现了错误
有的时候我们会见到 void mian() 的函数头,但不建议这样写。
参数列表:()
空的括号表示 main 函数不接受任何参数。在某些情况下,我们也会看到 int main(void) 的写法,两者在 C 语言中是等价的。
第三行:花括号 {}
{
printf("Hello world!\n");
return 0;
}
花括号 {} 定义了 main 函数的函数体,是一个代码块,包含了函数要执行的所有语句。
第四行:printf 函数
printf("Hello world!\n");
printf 是标准输入输出库中的一个函数,用于向标准输出(通常是终端)打印格式化的文本。
"Hello world!\n"是一个字符串常量\n是转义字符,表示换行符- 每一条语句以分号
;结束
第五行:return 语句
return 0;
return 语句结束函数的执行,并返回一个值。对于 main 函数,返回 0 表示程序正常结束。
三、程序 2:简易计算器
让我们来看一个稍微复杂一点的程序——简易计算器:
#include <stdio.h>
int main()
{
int num1, num2;
int sum;
// 输入数据
scanf("%d %d", &num1, &num2);
// 计算结果
sum = num1 + num2;
// 输出结果
printf("%d + %d = %d\n", num1, num2, sum);
return 0;
}
变量定义(声明)
int num1, num2;
int sum;
在 C 语言中,使用变量前必须先定义(声明)。这里定义了:
- 两个整型变量
num1和num2用于存储输入的数字 - 一个整型变量用于存储加法的结果
输入函数:scanf
scanf("%d %d", &num1, &num2);
scanf 函数用于从标准输入读取数据:
"%d %d"是格式字符串,表示要读取两个整数&num1和&num2是变量的地址,&是取地址运算符- 用户输入的两个整数会被存储到
num1和num2变量中
格式化输出:printf
printf("%d + %d = %d\n", num1, num2, sum);
printf 的格式说明符:
%d– 输出整数%f– 输出浮点数%c– 输出字符%s– 输出字符串