分类: 辅导答疑

  • 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 – 输出字符串