数据类型和值
除了调用嵌入式函数 Symbol,我们还可以使用我们自己在源代码中定义的函数。假设我们希望在日志中不仅打印 "Hello",还要根据一天中的不同时间打印不同的问候语。我们将一天中的时间精确到小时:0-8 是上午,8-16 是下午,16-24 是晚上。
合乎逻辑的建议是,新函数的定义结构必须与我们熟悉的 OnStart 函数的定义结构相似。但名称必须是唯一的,不能与其他函数或保留字的名称重复。我们将在本教材中进一步研究这些关键字的列表,幸运的是现在 Greeting 可以用作名称。
与 Symbol 函数一样,该函数必须返回一个字符串;不过该字符串必须是以下短语之一,具体取决于一天中的时间:"Good morning"、"Good afternoon" 或 "Good evening"。
根据常识,我们在本文使用了字符串的常见概念。显然编译器很熟悉这一概念,因为我们看到了它生成打印预定义文本程序的方式。至此我们已顺利引入了编程语言中“类型”的概念,其中一种类型是字符串,即字符序列。
在 MQL5 中,这种类型由 string 关键字进行描述。这是我们知道的第二种类型,第一种类型是 void。我们此前已经看到了这种类型的值,只是当时不知道的是:它是字面量 "Hello, "。当我们只是在源代码中插入一个常量(特别是引用的文本)时,无需提供其类型说明,编译器会自动正确定义类型。
以 OnStart 函数说明为范例,我们可以大致推断 Greeting 函数的形式。
string Greeting()
|
该文本表明我们创建 Greeting 函数的意图,该函数可以返回任意 string 类型的值。不过要让函数真正返回一些内容,就必须使用带有 return 运算符的特殊语句。它是 MQL5 众多运算符中的一个:我们将在下文进行深入探讨。如果函数的返回值类型不是 void,则它必须包含运算符 return。
特别是,要从函数返回之前的问候语字符串 "Hello, ",我们应该这样编写:
string Greeting()
|
return 运算符停止函数执行,并将其右侧的内容作为结果返回。输出中会隐藏用于调用函数的源代码片段。
我们还没有探讨编写可形成任意字符串的表达式的所有方法。不过这里沿用了带有引用文本的最简单例子(未做任何改变)。重要的是,返回值类型必须与函数类型一致,如我们的例子中所示。在语句的结尾添加了一个分号。
但我们希望根据一天中的不同时间生成不同的问候语。因此,该函数必须有一个用于定义小时的参数,其取值范围为 0 到 23。显然,小时数是一个整数,即一个没有小数部分的数字。很明显,时间不会停留在整点,分钟是计算在小时内的,分钟数也是一个整数。同样可以看出,就本例而言,精确到分钟来判断时段没有实际意义。因此,我们将只限于按小时数选择问候语。
对于整数值,MQL5 中有一个特殊类型 int。需要从程序中调用 Greeting 函数的位置向该函数传递此值。这里,我们首先需要描述一个命名存储单元,即变量。