深入 C 语言和程序运行原理
于航
PayPal 技术专家
21121 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 49 讲
深入 C 语言和程序运行原理
15
15
1.0x
00:00/00:00
登录|注册

01|快速回顾:一个 C 程序的完整生命周期

编译器实现基本语法
数据和量值
程序的汇编、链接与运行
C 代码的完整编译过程
链接
汇编
编译优化
代码预处理
更倾向于表达计算的逻辑
使用可以改变程序状态的代码语句
其他特性
函数内联
断言
指针
控制结构
结构与联合
数组
入口函数
C 语言核心语法实现
程序是否可以编译运行不添加 static 关键字
为函数添加 static 关键字的原因
总结
编译过程
声明式编程
命令式编程
C 语言的核心语法
下一讲内容
思考题
C 程序的编译和运行
C 语言的编程范式
C 语言基础知识
C 语言基础知识关系脑图

该思维导图由 AI 生成,仅供参考

你好,我是于航。
在深入了解 C 语言、做到“知其所以然”之前,我们需要先做到“知其然”,也就是知道 C 语言是如何使用的。所以这一讲,我会从语法细节和语言特性、微观和宏观相结合的角度,带你快速、直观地回顾 C 语言的一些基础内容。而通过本讲的学习,你也会更容易理解这门课接下来的内容。
首先,我会带你回顾一个 C 程序从源代码编写到编译,再到最后运行的完整过程。除此之外,我还会用一段相对复杂的示例代码,来带你快速回顾 C 语言中最常见的那些语法及使用方式。最后,我们还会从语言本身的角度,来探讨 C 语言与其他编程语言在编程范式上的不同之处。

学习这门课,需要怎样的实践开发环境?

在开始回顾这些内容之前,我要先向你推荐一些学习这门课时会用到的开发工具。你可以利用这些工具,自行编译和运行课程中给出的示例代码,以加深你对课程内容的理解。
对于编译工具,这门课会穿插使用运行于 x86-64 平台的 GCC 11.2 或 Clang 13.0.0 版本编译器。市面上有很多成熟的 C 编译器可以选择,但不同的编译器可能存在着所支持平台(类 Unix、Windows)以及 C 标准(C89、C99、C11、C17)上的差异,因此在选择时需要特别注意这些问题。这门课里使用的 GCC 和 Clang 都支持 C 语言的最新标准 C17,并且都可以运行在类 Unix 与 Windows 系统上。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文通过回顾一个 C 程序的完整生命周期,带领读者快速了解 C 语言的基础内容。文章首先介绍了学习该课程所需的实践开发环境,包括编译工具和 IDE 的选择。接着,通过一个相对复杂的示例代码,梳理了 C 语言的核心语法特性,包括入口函数、数组、结构与联合、控制结构、指针和宏等。文章以直观的方式展示了 C 语言的使用方式,帮助读者更容易理解这门课程的内容。整体而言,本文以技术性强、内容丰富为特点,适合对 C 语言感兴趣的读者快速了解 C 语言的基础知识。 文章还介绍了 C 语言的编程范式,将 C 语言作为一种“命令式”编程语言进行了解释,并与声明式编程语言进行了对比。此外,文章还涉及了 C 程序的编译和运行过程,详细介绍了代码预处理、编译优化、汇编和链接四个阶段。最后,通过思考题引发读者思考,为他们提供了一个思考和交流的机会。 总的来说,本文内容丰富,涵盖了 C 语言的基础知识、编程范式、编译和运行过程等多个方面,适合对 C 语言感兴趣的读者快速了解 C 语言的基本情况。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《深入 C 语言和程序运行原理》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(19)

  • 最新
  • 精选
  • pedro
    置顶
    我尝试去掉了 findAddr 函数中的 static 关键字,如下: inline /*static*/ const char* findAddr(const CONN* pip) 再次尝试编译,发现完全编译不过: gcc -o demo -Wall ./example.c /tmp/ccPazvp1.o: In function `main': example.c:(.text+0x14f): undefined reference to `findAddr' collect2: error: ld returned 1 exit status 评论区几乎无人去动手,差点误导了我,我猜测是与 const 这个关键词有关,请老师详解一下

    作者回复: 哈哈哈,实践出真知! 我直接在这里解答一下这个问题。正确情况下是如果在非优化的情况下,inline 需要配合 static 或者 extern 才能够编译。而在优化情况下,inline 可以单独使用。为什么会这样呢? 实际上,在 C17 标准中我们使用的 inline 关键字来源于 C99 标准。而在这个标准中,仅带有 inline 的函数具有 inline definition,表明该函数定义仅用于内联。而在非优化情况下,编译器通常会去寻找对应符号的 external definition(可以通过添加 extern 而获得),因此这种情况下会出现 linker error。而通过添加 static 关键字,可以使得对应函数定义具有 internal linkage,从而被编译器使用。在优化情况下,编译器会直接使用 inline definition 进行内联。 具体可以参考标准:http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf(112页,6.7.4.6)

    2021-12-09
    3
    38
  • ZR2021
    置顶
    老师,为啥是inline static而不是static inline的?这里有点奇怪

    作者回复: 这是一个好问题。首先,这两种写法都是可以正常工作的。在 C17 标准之前,declaration specifier 可以按照任意的顺序摆放。而自 C17 标准之后,便规定 storage-class specifier(包含 static)应该被放置在各类定义的最开始,其他形式则为过时的写法。 6.11.5 Storage-class specifier The placement of a storage-class specifier other than at the beginning of the declaration specifiers in a declaration is an obsolescent feature.

    2021-12-07
    24
  • ZR2021
    工作5年了,都是纯c开发,看了很多开源代码,内核代码,就是没时间好好总结深入,正好这次趁这门课跟着于老师好好总结学习下,万分期待!!!

    作者回复: 哈哈哈,欢迎支持,一起学习!

    2021-12-07
    3
    7
  • 送过快递的码农
    老师,宏和函数的区别是啥?我之前听说他比函数访问更加快?执行上面是否一致呢,函数要进行call,压栈,完事儿出栈,还得ret返回调用前地址 ,但是宏相对简单一点?函数编译需要链接,宏相当于常量,操作系统全局,所以不需要么?函数处理内容更加多,宏比较固定?主要Java程序员没接触过宏,所以感觉是个很陌生的领域

    作者回复: C 中的宏你可以简单理解为根据一定规则对源代码进行的字符替换,并且这个过程是在编译器开始处理 C 语法代码之前就会进行的。这部分内容我们会在第 09 讲介绍哈。

    2021-12-06
    5
    3
  • 勇闯天涯
    老师你好,有什么推荐的C语言书籍吗?偏进阶和高级篇的那种

    作者回复: 可以看看《Modren C》?

    2021-12-08
    3
    1
  • LDxy
    findAddr函数一定要写在main函数的前面吗?

    作者回复: 不一定哈,可以在函数调用前先写函数原型,然后函数体就可以放在任意位置了。

    2021-12-07
    1
  • 神佑小鹿
    通过该指针,我们无法在函数内部修改指针所指向对象的值。 ?? 这个说法有问题吧??拿到地址了,可以改地址对应的内存吧

    作者回复: 这里的指针是一个 const 指针,所以我们无法通过该指针来修改指向变量的值。

    2022-05-04
    2
  • 纳兰容若
    老师您好 有个问题请教一下 咱们的示例程序中_Generic使用了c11的语法 类似的c11、c17中新用法在哪里查询呢 有类似MSDN的文档么

    作者回复: 可以在这边看哈,不过需要科学上网:https://en.cppreference.com/w/c

    2022-04-08
    2
  • JulyRemember
    为啥我用VScode去掉static可以编译通过并且运行结果是和不加值一样的,因为对C语言不太了解,所以也不知道为啥。

    作者回复: 可以看一下是不是编译时使用了 -O0 以上的优化等级。

    2022-03-21
  • Geek_e95a91
    typename(),c标准支持嘛?

    作者回复: 你是说 C++ 中的 template 吗?

    2022-03-10
收起评论
显示
设置
留言
19
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部