错误、漏洞、问题 - 页 2641

 
bool Func()
{
  for(int i=1;;++i)
  {
    if(i==1)
      continue;
    if(i==100)
      return false;
  }
}

void OnStart()
{
  Func();
}

有这样一位顾问。它抛出了一个错误

'}' - not all control paths return a value      Test.mq5        10      1

如果你评论出来继续,那就好了。只有我一个人认为这很奇怪吗?

 
traveller00:

有这样一位顾问。它抛出了一个错误

如果你评论出来继续,那就好了。难道只有我一个人认为这很奇怪吗?

如果一个函数没有被声明为void,它必须返回一个值

bool Func()
{
  for(int i=1;;++i)
  {
    if(i==1)
      continue;
    if(i==100)
      return false;
  }
  //---
  return(false);
}
 
这个函数的唯一出口是通过i==100。为什么他认为 "继续 "的出现会导致函数的额外退出?
 
traveller00:
离开这个函数的唯一途径是通过i==100。为什么他认为 "继续 "的出现会导致功能的额外退出?

单一或多个输出并不重要。重要的是,你声明了一个类型不是void的函数--这意味着该函数必须返回一个值。

 

该函数并返回一个值

bool Func()
{
  for(int i=1;;++i)
  {
    if(i==1)
      continue;
    if(i==100)
      return false;
  }
}

这是该功能的唯一出路。也就是唯一必须返回一个值的地方。而C/C++编译器也同意我的看法。如果MQL对此仍有自己的标准,那么,如果继续被删除,为什么它能正常构建?

 
traveller00:

该函数并返回一个值

这是该功能的唯一出路。也就是唯一必须返回一个值的地方。而C/C++编译器也同意我的看法。 如果MQL对此仍有自己的标准,那么,如果继续被删除,为什么它能正常构建?

编译器不知道循环是否会被处理,代码是否会达到返回;因此,它需要一个安全功能。

 
Alexey Viktorov:

编译器不知道循环是否会被处理,代码执行是否会达到返回;这就是为什么它需要一个安全预防措施。

C/C++编译器完全知道这一点。据我所知,MQL编译器是基于C/C++编译器之一的。但话又说回来,即使它有自己的逻辑,为什么没有继续它就知道,而有了继续这种知识就没有了?

 
traveller00:

C/C++编译器完全知道这一点。据我所知,MQL编译器是基于C/C++编译器之一的。但话又说回来,即使它有自己的逻辑,为什么没有继续它就知道,而有了继续这种知识就没有了?

可能是因为只有第一眼看到这种代码的人

bool Func()
{
  for(int i=1;;++i)
  {
    if(i==100)
      continue;
    if(i==100)
      return false;
  }
}
可以不假思索地猜出将要发生什么。在我看来,应该是C和C++,而不是MQL。正是mql防止了这种意外的错误。
 
traveller00:

该函数并返回一个值

这是该功能的唯一出路。也就是唯一必须返回一个值的地方。而C/C++编译器也同意我的看法。 如果MQL在这方面仍有自己的标准,那么,如果继续被删除,为什么它能正常构建?

你的这个功能是一个错误。如果i==100,那么下一次对相同的i==100的检查将不起作用。而你会得到一个无限的循环。

 
亲爱的开发者,请指出这个错误
Обсуждение статьи "Торговый эксперт с графическим интерфейсом: Наполнение функционалом (Часть II)"
Обсуждение статьи "Торговый эксперт с графическим интерфейсом: Наполнение функционалом (Часть II)"
  • 2018.06.10
  • www.mql5.com
Опубликована статья Торговый эксперт с графическим интерфейсом: Наполнение функционалом (Часть II): Автор: Anatoli Kazharski...