最后由 麻爪 于 2026-9-9 13:10 编辑
第十七章 空值和零
一、空不是零、零不是空
在MQL5语言中,有多种表示空或者零的概念,但彼此又不相同,如不加以区分,很多人见到之后都会懵比。我做了一个总结,如下表所示:
表格中前三种,都是0,但这个0仅仅是在程序的2进制底层代码上显示为0,在业务逻辑上完全不同。后两种也都叫“空”,但空数组表示有位子无元素,无返回值的空,那是真的什么都没有。
这一节我们着重研究void空值和NULL常量。void是系统关键字,NULL是宏常量,大小写不能改变。
二、void空值
void往往会被说明为,本函数不返回任何值。所以要理解何为void空值,先要明白什么是“函数返回值”。
在编程中的所谓“函数”,与我们在数学中学的“函数”有点类似。它也可以去做加减乘除以及各种运算,有参数输入,有结果输出。
但程序中的函数,输出的并不一定是数据,也可以输出一种动作,比如修改了其他函数的某个参数,打印了日志文件,甚至是执行了买卖操作等,这叫函数的副作用。这种输出动作的函数,没有任何数据输出。所以说一个函数返回void空值或者说没有返回值的函数,只是说它没有返回一个数据,而不是说它啥都没返回。
但void确实是一种数据类型,通常放在函数前面,用来定义该函数没有返回值。
根据函数之前是否带有void,可以清楚明了的把函数划分为有返回值函数和无返回值函数两大类。简单来说,有返回值的函数,开头肯定没有void,而是其他数据类型,偏向数据加工工具,送入参数,内部加工,输出一份结果给调用方拿去计算、赋值。无返回值函数,开头一般会有个void,偏向执行动作,完成一件事情(打印、下单、修改变量),不把加工结果通过返回通道交回来。
但是需要知道,有返回值的函数,也可以通过内部代码实现某种动作。而无返回值的函数,只是表面上没有直接的输出数据,但它本质上还是通过修改其他参数来输出动作,这个修改其他参数也是一种数据输出。所以这种划分方法,并不是本质内涵的实质性区别,只是形式上的区别。
三、NULL常量
MQL5 中NULL是内置常量,等价整数0;它不是数据类型,不是一个数学意义上的数字,也和 void 空型无关。主要用于资源句柄(文件句柄等),表示请求失败。
我们自己写普通业务逻辑(写自己的函数、变量、策略计算),几乎不需要主动写 NULL。 NULL 主要是接收系统 API 的返回值,用来判断:资源有没有申请成功。我们写NULL写的最多的就是,if(fh == NULL) { Print("打开失败"); },意思如果结果是NULL,那就在日志中输出调用失败的结果。
要理解何为资源句柄,需要先了解API。我们学习编程,API是个经常见到的词汇。API翻译成人话就是“应用程序编程接口"。我们编的EA是无法直接让交易商给我们开单买卖的,真正能让交易商给我们开单的是MT5平台,这个MT5就是应用程序。我们编的EA,通过MT5预留的一些接口,调用MT5的开单指令,从而最终实现开单。
也就是说,我们编的程序,里面能命令MT5给我们干活,而不是要自己写代码去实现的功能,就叫API,也就是MT5程序可供我们调用的”资源“。我们调用API,API会给我们一个回馈,如果调用成功了,给我们成功的结果,这个结果会复杂很多。如果调用不成功,那它就简单粗暴给你一个”NULL“。 |