做好闭环(二):函数是压缩的数组,数组是展开的函数
函数:自己动手实现低配版 scanf 函数
- 深入了解
- 翻译
- 解释
- 总结
本文深入探讨了函数和数组在程序设计中的重要性,以及预处理命令中的宏定义和条件编译的使用方法。作者以“函数是压缩的数组,数组是展开的函数”为主题,通过生动的例子和清晰的解释,阐述了函数和数组之间的联系和区别。文章通过具象化的例子解释了函数和数组的本质区别,以及它们在时间和空间效率上的差异。此外,还介绍了预处理命令中的宏定义和条件编译,并解答了读者关于查看预处理阶段后的待编译源代码内容的问题。通过解决 MAX 宏的问题,读者可以深入了解宏定义的技巧和预处理命令的强大功能。总之,本文通过生动的例子和清晰的解释,帮助读者更好地理解函数和数组在程序设计中的重要性,以及预处理命令的使用方法。
《人人都能学会的编程入门课》,新⼈⾸单¥59
全部留言(10)
- 最新
- 精选
- 潮汐很多问题还是无法自己独立思考出来,需要参照下面留言和老师的答疑,才能发现,原来应该这样啊! 针对宏命令的问题,看了老师的答疑,对,宏定义只是做简单的替换,有更深刻的理解了!
作者回复: 学习是一个螺旋上升的过程,可以先跟着专栏走一遍,然后有时间的时候,再看第二遍,一般都会有新的认识。
2020-02-024 - 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-0122 - 潮汐回复老师: #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-031 - AMOS周末动手
作者回复: 赞
2020-03-27 - 信念为什么 (4) ? (2) : (3 > 4 ? 3 : 4) 的结果为2? (4)?这个条件怎么理解?4为什么为真?
作者回复: 非0即为真。
2020-03-084 - 信念<表达式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-026