251109 答疑

一、一些前置的小问题

我们学的是 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 语言中,使用变量前必须先定义(声明)。这里定义了:

  • 两个整型变量 num1num2 用于存储输入的数字
  • 一个整型变量用于存储加法的结果

输入函数:scanf

scanf("%d %d", &num1, &num2);

scanf 函数用于从标准输入读取数据:

  • "%d %d" 是格式字符串,表示要读取两个整数
  • &num1&num2 是变量的地址,& 是取地址运算符
  • 用户输入的两个整数会被存储到 num1num2 变量中

格式化输出:printf

printf("%d + %d = %d\n", num1, num2, sum);

printf 的格式说明符:

  • %d – 输出整数
  • %f – 输出浮点数
  • %c – 输出字符
  • %s – 输出字符串