当初刚接触C语言自学的时候,对着编译软件敲了满满一页代码,编译成功却跑不出预期结果,整整熬了两个晚上,一直纠结c语言从什么开始执行这个基础问题,愣是没摸透底层逻辑,白白浪费了大把的时间。那时候总凭着自己的直觉写代码,觉得代码从上到下逐行运行,写在最开头的函数就会最先被执行,完全搞错了核心规则,踩了新手最典型的误区。
那次写的是一个简单的两数求和程序,为了练手熟悉自定义函数用法,特意先编写了加法运算的自定义函数,把它放在了所有代码的最顶端,随后才慢悠悠的写了main函数,当时还自以为这样的排版更规整,能把功能模块前置。
编译没报错。
运行出来的结果完全乱套,要么是空白无输出,要么是跳出一堆随机的乱码数值。反复核对变量定义、运算公式,所有语法规范、标点符号、语句分号、int数据类型全都检查了好几遍,甚至逐行对照网上的基础教程代码逐字修改,依旧找不到任何语法问题,可程序的功能就是完全不对。当时整个人特别烦躁,明明没有任何报错提示,代码书写也完全合规,为什么简单的求和功能都实现不了,压根想不到问题根源出在程序的执行入口逻辑上。
折腾好久才搞明白,C语言的运行逻辑和普通文本的阅读逻辑完全不一样,从来不会按照代码书写的前后顺序依次执行。不管你在文件里写了多少自定义函数、全局变量,不管这些内容排布在代码的开头、中间还是末尾,程序唯一的启动入口永远是main函数,这是编译器固定的识别规则,没有任何例外。
那天还特意做了对照测试,把原本放在最前面的加法自定义函数挪到main函数的后方,同时在main函数体内调用这个加法函数,全程只改动了这一处位置,其余所有代码一字未改,再次编译运行的瞬间,程序直接输出了精准的求和结果。那一刻才彻底反应过来,所有自定义的功能函数、辅助代码,都只是储存在文件里的备用代码块,不会主动运行,只有被main函数调用时,才会被执行。
很多初学C语言的人都会犯和我一样的错,胡乱排布函数位置,堆砌大量代码后坐等程序运行,误以为书写位置决定执行顺序。实际上哪怕你把自定义功能代码写在整个文件的第一行,只要没有在main函数里触发调用,这部分代码就相当于无效代码,编译器会直接跳过,不会进行任何运算执行。
还有个容易混淆的细节,不少新人会纠结int main和void main的区别,误以为两种写法会改变程序的执行起始位置。实际反复实操过后能确定,两种写法只是返回值的定义不同,一个需要返回整型数值,一个无返回值,完全不会影响程序的启动入口,不管哪种写法,程序都是从main函数开始运行。
那天凌晨三点关掉编译器的时候,屏幕还亮着修正后的代码界面,随手点击保存关闭了文件,躺到床上之后,脑子里只剩原来最简单的C语言执行逻辑,根本没自己想的那么复杂。