11

c语言入门3,掌握它就能随心所欲的编程了,自己造积木

 3 years ago
source link: https://blog.popkx.com/c-language-3-master-it-can-be-arbitrary-programming-build-their-own-blocks/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

c语言入门3,掌握它就能随心所欲的编程了,自己造积木

发表于 2018-11-04 21:11:06   |   已被 访问: 349 次   |   分类于:   C语言   |   暂无评论

前面两节介绍了如何快速搭建 C 语言开发学习环境,并且给出并解释了 hello world 的代码。上一节介绍了C语言的函数,应该注意到,到目前为止,我们使用的函数都是现有的系统函数(例如 printf,sin 等函数)。事实上,实际需求通常是非常复杂的,只依靠现有的函数很难完成。好在我们可以根据需求,自己定义 C 函数。

53a53a0ed7c7273c1b59705cbf4764dd.png

可以把一个函数看作是一块积木,各种各样的积木才能堆积成复杂的建筑。只有几种积木,能完成的建筑太有限了,如果能够自己造各种各样的积木,再复杂的建筑也能完成。

通过前面两节的内容,我们已经了解函数定义的语法了:

返回值类型 函数名(参数列表)
{
    语句列表
}

注意函数名在相应可见域内要保持唯一性,例如,在 main 函数所在文件里定义的函数名不能也为 main。再啰嗦一下 main 函数,主要是因为它是默认的入口函数,比较特殊。

  1. Old Style C的风格的 main 函数定义写成 main(){...} 形式,不写返回值类型也不写参数列表。Old Style C规定不写返回值类型就表示返回int型,不写参数列表就表示参数类型和个数没有明确指出。这种宽松的规定会导致很多复杂的Bug产生,现在的 C 也保持了这种写法的兼容,但是鉴于它可能会产生 bug,还是不要这样写。
  2. 其实系统在调用 main 函数时是传参数的,所以 main 函数最标准的形式应该是 int main(int argc, char * argv[]),这种参数传递在 linux 下使用起来非常方便,以后用到了再详细解释。C标准也规定了 int main(void) 这种形式,如果不使用系统传进来的两个参数也可以写成这种形式。但除了这两种形式之外,以其它形式定义main函数都是错误的或不可移植的。

f2873a1be16014343595f867d43fdc50.png

自定义函数

在了解了自定义函数的一些限制后,很容易就可以写出如下代码。下面的代码中,我们定义了 printA 函数,它的参数为空,也没有返回值,仅仅是打印出一个字母 “A”。

#include <stdio.h>
#include <stdlib.h>

void printA(void)
{
    printf("A\n");
}
int main()
{
    printA();
    return 0;
}

我们在 codeblocks 里执行它,发现程序在控制台中打印出了字母 A。

关于 codeblocks 的安装和使用,可参照第一节。

282971dc6147e6aab5e83098f730cf96.png

以后如果想打印 A,只需要执行 printA 函数就可以了。更进一步的,我们自己定义的 printA 函数也可以当做系统函数(例如)一样嵌套使用,请看如下代码:

#include <stdio.h>
#include <stdlib.h>

void printA(void)
{
    printf("A\n");
}
void print2A(void)
{
    printA();
    printA();
}
int main()
{
    print2A();
    printf("----\n");
    print2A();
    return 0;
}

我们又新定义了一个函数 print2A,它的功能就是在控制台打印两个 A。在 codeblocks 里执行,发现与预期一致。

f262aaf561182bf78d026464decd59f0.png

从上面的简单例子中,可以总结出以下信息:

  • 同一个函数可以调用多次。
  • 可以用一个函数去调用另一个函数,第二个函数可以去调用第三个函数。
  • 调用自定义的函数,是通过我们取的名字调用的,例如 main 函数中调用 print2A();
  • 函数可以使代码更简洁,原本打印两个 A 需要两行代码,现在只需要 print2A 一行就可以了。

你可能会说,我定义 print2A 就用了 5 行啊,哪里简洁了。可是,以后只要遇到需要打印两个 A 的地方,我都可以调用 print2A,如果有 10 个地方需要打印两个 A 呢?另外,如果有一天,我想在打印两个 A 的时候不换行,那我只需要修改 printA,把里面的 “\n”删掉就可以了,而不用去找那 10 个需要打印两个 A 的地方逐个修改。

读代码和读文章不一样,按从上到下从左到右的顺序读代码未必是最好的。比如上面的例子,按顺序应该是先看 printA 再看 print2A 再看 main。不过,如果换一个角度,按代码的执行顺序来读也许会更好:

400b606565417c5568d7fe0f10688ff3.png

因为 main 是入口函数,所以第一句要执行的就是 print2A 函数,那它是什么功能呢?于是目光移到 print2A 函数,它的第一句是 printA 函数,于是进入 printA 函数。奥,知道了 print2A 先要打印一个 A,然后又要执行 printA 函数,又打印了一个 A。这下知道了,main 函数里的第一句要打印两个 A。

实际上,在很多大型项目中,要熟悉它的代码结构,第一件事往往就是找到入口函数。

阅读更多:   C语言


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK