人人都能学会的编程入门课
胡光
原百度高级算法研发工程师
19410 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 38 讲
开篇词 (1讲)
人人都能学会的编程入门课
15
15
1.0x
00:00/00:00
登录|注册

做好闭环(二):函数是压缩的数组,数组是展开的函数

你好,我是胡光。
不知不觉,我们已经学完了语言基础篇的全部内容。其实还有很多东西想给你讲,可限于篇幅,所以咱们整个语言基础篇中的内容,都是那些,我认为你自学容易忽视的,容易学错的知识点。有道是,授之以鱼,不如授之以渔,我也相信只要你跟着课程学习,一定会感觉到自己收获到了“渔具”。如果能引发你的主动思考,进而触类旁通,举一反三,那这场学习过程就更加有意义啦。
我也非常高兴,看到很多同学都在紧跟着专栏更新节奏,坚持学习。每每在专栏上线的第一时间,这些同学就给我留言,提出自己的疑惑。大部分留言,我都在相对应的文章中回复过了,而对于文章中的思考题呢,由于要给你充足的思考时间,所以我选择在今天这样一篇文章中,给你进行一一的解答。
看一看我的参考答案,和你的思考结果之间,有什么不同吧。也欢迎你在留言区中,给出一些你感兴趣的题目的思考结果,我希望我们能在这个过程中,碰撞出更多智慧的火花。

函数:自己动手实现低配版 scanf 函数

在这一节里面呢《函数:自己动手实现低配版 scanf 函数》,我们讲了函数的基本概念,明确了“实参”和“形参”两个概念,并且知道了函数传参的过程,就是“实参”给“形参”赋值的过程。
还有,我们介绍了“传入参数”和“传出参数”两个概念,弄懂这两个概念,对于设计一个函数来说,还是非常重要的。“传入参数”是从外部,传入到函数内部,影响函数内部执行逻辑的参数,“传出参数”呢,就是由函数内部,传出到函数外部的参数,一般是以传送地址为主要形式。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了函数和数组在程序设计中的重要性,以及预处理命令中的宏定义和条件编译的使用方法。作者以“函数是压缩的数组,数组是展开的函数”为主题,通过生动的例子和清晰的解释,阐述了函数和数组之间的联系和区别。文章通过具象化的例子解释了函数和数组的本质区别,以及它们在时间和空间效率上的差异。此外,还介绍了预处理命令中的宏定义和条件编译,并解答了读者关于查看预处理阶段后的待编译源代码内容的问题。通过解决 MAX 宏的问题,读者可以深入了解宏定义的技巧和预处理命令的强大功能。总之,本文通过生动的例子和清晰的解释,帮助读者更好地理解函数和数组在程序设计中的重要性,以及预处理命令的使用方法。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《人人都能学会的编程入门课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(10)

  • 最新
  • 精选
  • 潮汐
    很多问题还是无法自己独立思考出来,需要参照下面留言和老师的答疑,才能发现,原来应该这样啊! 针对宏命令的问题,看了老师的答疑,对,宏定义只是做简单的替换,有更深刻的理解了!

    作者回复: 学习是一个螺旋上升的过程,可以先跟着专栏走一遍,然后有时间的时候,再看第二遍,一般都会有新的认识。

    2020-02-02
    4
  • 1900
    @Aaren Shan 的方法我早就想到了,是不行的,我后面试了如下方法,还是不行。 #define MAX(a, b) { \ __typeof(a) c = a; \ __typeof(b) d = b; \ c > d ? c : d; \ } 今天看了老师的答案,发现原来是要用括号括起来,就搞定了,即: #define MAX(a, b) ({ \ __typeof(a) c = a; \ __typeof(b) d = b; \ c > d ? c : d; \ }) 另外还有个疑问,最早我是这样写的 #define MAX(a, b) (__typeof(a) c = a, __typeof(b) d = b, c > d ? c : d;) 编译器报错,通不过,看报错原因是缺少“)”,但并没看懂这个报错原因,请胡老师解答。

    作者回复: 你把你的这个宏展开一下,代码会是 int c=a的内容,int d=b的内容,c>d...,在同一行中用逗号表达式链接了两个定义语句,这存在语法歧义,这是不对的。

    2020-02-01
    2
    2
  • 潮汐
    回复老师: #define MAX(a, b) ({ __typeof(a) __a = a, __b = b, __a > __b ? __a : __b })编译报错 #define MAX(a, b) ({ __typeof(a) __a = a, __b = b; __a > __b ? __a : __b; })通过 老师,c中,多行代码逻辑写成一行也是用;做分隔吗? 还有一个是typeof前面两个下划线是什么用意?直接用typeof也可以。

    作者回复: 对的,也是用;做分隔。关于typeof这个,你可以认为,有两个下划线和没有的其实是两个东西,可两者的作用相同,而一般有两个下划线的更通用一些。

    2020-02-03
    1
  • AMOS
    周末动手

    作者回复: 赞

    2020-03-27
  • 信念
    为什么 (4) ? (2) : (3 > 4 ? 3 : 4) 的结果为2? (4)?这个条件怎么理解?4为什么为真?

    作者回复: 非0即为真。

    2020-03-08
    4
  • 信念
    <表达式1>?<表达式2>:<表达式3>。 条件表达式如果?前面的表达式1成立则执行表达式2,否则执行表达式3

    作者回复: 对的!

    2020-03-08
  • 不便明言
    老师,你这里分析宏MAX第3行的错误是不是写错了应该是第4行:MAX(2, 3 > 4 ? 3 : 4) = 2的问题啊,我看第一遍怎么也没看明白第三行和你的分析的对应关系,做了测试后又返回来看这个了。

    作者回复: 没错,是第 3 行。你将第 3 行的宏展开,就会得到文中我给出的展开结果,其实你要说第三行和第四行在这个时候,展开结果一样,这是正确的。可一旦,MAX 宏的实现变了,第三行和第四行的展开结果就不同了。

    2020-02-16
  • 潮汐
    回复老师: #define MAX(a, b) ({ __typeof(a) __a = a, __b = b, __a > __b ? __a : __b }) 老师说可以写一行,请问这种写法的编译问题怎么处理,是哪里没写对吗,我能想到的就是,分隔语句,请老师指点

    作者回复: 你将这个宏展开,你看看是不是一句合法的C语言代码。你就明白了。^_^

    2020-02-02
  • 潮汐
    老师,按照@1900的写法,写成一行是不是一定行不通(编译不通过),如果宏替换内容包含多行的逻辑,是不是一定要换成多行的写法,用;结尾每一行?

    作者回复: 宏定义即使在实现的时候是多行,实际替换出来也是一行代码。;结尾的多个语句,也可以写在同一行。

    2020-02-02
  • 栾~龟虽寿!
    着急!还请大家答复我,上次课log那个bug,如何消除,我把helloworld后面加上一个参数,如"huu"就行了,但估计不是这个意思。

    作者回复: 其实只需要在将第二个printf语句改写成:printf(frm,##args);即可。

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