函数定义

函数定义包括返回的值类型、标识符、参数列表(用圆括号括起)和主体,主体是指包含语句的代码块。列表中的各参数用逗号分隔。每个参数都被赋予一个类型、一个名称和一个默认值(可选)。

result_type function_identifier ( [parameter_type parameter_identifier
                                       = value_by_default] ,... )
{
  [statement]
   ...
}

允许创建不带参数的函数:那么就没有列表,并且函数名后面带空括号(不能省略括号)。或者也可以在括号中间写入 void 关键字,以强调没有参数。例如,像这样:

void OnStart(void)
{
}

列表中参数的返回类型、数量和类型的组合称为函数原型或签名。不同的函数可以有相同的原型。

在前面的章节中,我们已经看到了 OnStartGreeting 之类的函数定义。现在让我们尝试将计算斐波那契数作为一个测试函数。斐波那契数的计算公式如下:

f[0] = 1
f[1] = 1
f[i] = f[i - 1] + f[i - 2], i > 1

第一和第二个数字是 1,后面所有数字都是其前两个数字之和。我们给出数字串的开头:1, 1, 2, 3, 5, 8, 13, 21, 34, 55...

可以使用以下函数 (FuncFibo.mq5) 计算给定索引所指的字数。

int Fibo(const int n)
{
   int prev = 0;
   int result = 1;
   for(int i = 0i < n; ++i)
   {
      int temp = result;
      result = result + prev;
      prev = temp;
   }
   return result;
}

取一个 int 类型的参数 n 并返回一个 int 类型的结果。n 参数有 const 修饰符,因为我们不打算在函数内部改变 n(这种对变量“权限”约束的显式声明值得提倡,因为有助于避免随机错误)。

局部变量 prevresult 将存储序列中最后两个数字的当前值。在对 i 的循环过程中,我们计算它们的和,获取序列的下一个数。此前,旧值 result 被写入变量 temp,因此在求和后,它被传递到 prev

执行给定次数的循环后,result 变量包含预期数字。我们使用 result 语句从函数中返回这个数。

函数的输入参数也是一个局部变量,它将在函数调用期间被初始化为实际值。通过函数调用,该值从语句“外部”传递。

参数名必须是唯一的,并且不能与局部变量名相同。

函数体是一个代码块,定义了 局部变量的作用域和生存期。它们的定义和操作原理将在 声明/定义语句初始化章节中介绍。