人人都能学会的编程入门课
胡光
原百度高级算法研发工程师
立即订阅
953 人已学习
课程目录
已更新 15 讲 / 共 32 讲
0/2登录后,你可以任选2讲全文学习。
开篇词 (1讲)
开篇词 | 别闹了,学编程 ≠ 学语言
免费
语言基础篇 (13讲)
01 | 学习编程,我到底该选择哪门语言?
02 | 第一个程序:教你输出彩色的文字
03 | 判断与循环:给你的程序加上处理逻辑
04 | 随机函数:随机实验真的可以算 π 值嘛?
05 | 数组:一秒钟,定义 1000 个变量
06 | 字符串:彻底被你忽略的 printf 的高级用法
做好闭环(一):不看答案可能就白学了
07 | 指针系列(一):记住,指针变量也是变量
08 | 指针系列(二):记住,指针变量也是变量
09 | 函数:自己动手实现低配版 scanf 函数
10 | 预处理命令(上):必须掌握的“黑魔法”,让编译器帮你写代码
11 | 预处理命令(下):必须掌握的“黑魔法”,让编译器帮你写代码
做好闭环(二):函数是压缩的数组,数组是展开的函数
测试篇 (1讲)
期中测试 | 给语言基础篇交一份满分答卷,去迎接新的挑战!
人人都能学会的编程入门课
登录|注册

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

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

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

在这一节里面呢《函数:自己动手实现低配版 scanf 函数》,我们讲了函数的基本概念,明确了“实参”和“形参”两个概念,并且知道了函数传参的过程,就是“实参”给“形参”赋值的过程。
还有,我们介绍了“传入参数”和“传出参数”两个概念,弄懂这两个概念,对于设计一个函数来说,还是非常重要的。“传入参数”是从外部,传入到函数内部,影响函数内部执行逻辑的参数,“传出参数”呢,就是由函数内部,传出到函数外部的参数,一般是以传送地址为主要形式。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《人人都能学会的编程入门课》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(6)

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

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

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

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

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

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

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

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

    2020-02-02
    5
收起评论
6
返回
顶部