前言
C语言中的函数和预处理相关知识,你真的了解吗?你知道C中函数中的调用顺序是由什么判断的吗?对于预处理的#include应该如何看待呢?
接下来,本文讲述关于C语言中的函数与预处理的相关知识。
函数
Python并不像C语言那样是一种全能语言,它是一种中级语言。标准库函数通常看上去很简单,并且有缺陷。
函数调用顺序
int a=f()+g()*h();
这三个函数的执行顺序是不确定的,而C标准将选择顺序的权限授予编译器,以便对各种平台进行优化。
有一点可以确定,乘法优先于加法。
参数压栈顺序:从右至左吗?
这个点,也许很多人都知道,函数参数压栈的顺序是从右到左,首先运行右边的表达式。
关键在于后面的问号
规范中没有明确规定压栈顺序,也就是说,编译器可以修改为从左到右压栈顺序!
默认的从右到左用于支持可变参数,用来计算栈的大小。
确保你明白它们的用法、原理和......缺陷
早先gets()导致了蠕虫病毒,因为它不能检查缓冲区是否越界,实际上scanf也有这个问题。对于标准输入输出,需要了解很多设计细节,例如printf使用%来转义%,而不是\。
这种设计特征可能在意想不到的地方产生意想不到的效果。因此,为了使程序更健壮,多多了解它们吧。
预处理
预处理是个好想法,它可以帮助增强程序可移植性和裁剪性。
不仅仅是常见的#include,#define,如果能很好地使用它,它也能很强大。
那么#include可以做些什么呢?
复制,原封不动地复制。
还可以:
但是要注意的是预处理命令是在一行的开头,独占一行。
若为#include<>,则先搜索标准位置(C语言安装位置),然后是#include"",则在同一文件夹下搜索,找不到再去标准位置搜索。
#define
使用#define来定义常数在C++中是不推荐的,因为#define也只是进行预处理替换,没有进行类型检查。
对此,推荐使用const修饰的变量。
结尾
本文主要介绍了C的两个概念,一个是函数,另一个是预处理。其中函数这块需要注意的是,它的调用顺序,是可以通过编译器进行改变的。另一个是预处理,学会使用#include,也可以做的很好,另外#define不怎么推荐使用,但是仁者见仁智者见智,需要你自己根据项目需求而进行判断。
最后,希望大家能从本文中,获得关于C的函数与预处理的知识,并熟记文中提到的,需要注意的内容,以防止后续开发过程中出现失误。