错误、漏洞、问题 - 页 416

 
Yedelkin:

那么,如果变量属于bool类型,原则上只有两个值,而这两个值都在switch语句中使用,那么指定default:return(false )的意义何在?换句话说,默认标签根本就不应该被执行。

P.S. 1.另外,如果我们按照你的方法,那么默认的标签就变成了强制性的,而不是可选的。

2.断点运算符在这两种情况下都是没有意义的。

switch 操作符将你的bool_var 转换为一个整数类型。

而编译器也不必知道这个变量有两个值。这不是在逻辑上分析算法。

 
Interesting:

你还忘了一件事--任何变量都可能有一个无效的值或未被初始化(有一个 "垃圾 "值)......

我没有忘记。所以在我的例子中,这个变量被初始化了。尽管这样,编译器还是产生了一个错误。

bool_var=-1 的例子是极其不正确的自己看吧。

bool bool_var=-1;
void OnStart()
  {
   Print("bool_var=",bool_var);
  }   
 
Dima_S:

switch 语句将你的bool_var 转换为一个整数类型

而编译器也不需要知道这个变量有两个值。它没有从逻辑上分析该算法。

顺便说一下,对于布尔运算,有一个幸运的变体,当一个未初始化的变量或一个数值为-1的变量,例如,将被铸成真/假。

当然,如果你明确地将变量声明为int,这就不会发生。

耶德尔金

我没有忘记。这就是为什么在我的例子中变量被初始化了。尽管这样,编译器还是产生了一个错误。

bool_var=-1 的例子是极其不正确的说服你自己。

我已经深信不疑,这就是我把它删除的原因。但这是一种偶然的运气(把它看作是语言的一个特点)。

但在处理开关 块中可能出现的错误时,编译器不必弄清楚那里输入的是什么和如何输入的,所以编译器把它当作一个错误,而不是一个警告。

 
Dima_S:

而编译器也不需要知道这个变量有两个值。它不是在对算法进行逻辑分析。

所以你是说,编译器没有考虑到枚举中的值列表和它们的总数量?

 
Interesting:

但在处理开关 块中可能出现的错误时,编译器不需要弄清楚它的输入内容和方式,所以编译器将其视为错误,而不是警告。

中间的结论如下:在使用枚举+开关时,使用默认标签成为强制性的
 
Yedelkin:

1. bool已经是一个 "整数类型"。或者你是说switch是转换到更高的整数类型。

2.你是说编译器没有考虑到枚举值的列表和它们的总数?

1. bool是一个整数类型,大小为一个字节。转换为int类型,你是对的。

2.你在这里也是对的。只有case不是一个枚举,而只是条件分支的一个标签。

Документация по MQL5: Основы языка / Типы данных / Целые типы / Типы char, short, int и long
Документация по MQL5: Основы языка / Типы данных / Целые типы / Типы char, short, int и long
  • www.mql5.com
Основы языка / Типы данных / Целые типы / Типы char, short, int и long - Документация по MQL5
 
Dima_S:

1. bool是一个一字节的整数类型。转换到int类型,你是对的。

根据《手册》,bool是除整数以外的特殊类型...所以我删除了我的不正确的声明。虽然我不打算争论--我不是专家。

Dima_S:

耶德尔金

所以你的意思是,编译器不考虑来自枚举的值列表和它们的总数量?

2.你在这里写得也很正确。只有case不是一个枚举,而只是一个条件分支的标签。

我指的是枚举(考虑到bool类型是最小的),而不是案例标签。下面是一个具有相同编译错误的例子。

enum Triple
  {
   err=-1,
   no = 0,
   hay= 1
  };
Triple triple_var=err;
Triple Test(void)
  {
   switch(triple_var)
     {
      case  err: return(err);
      case   no: return(no);
      case  hay: return(hay);
      //default:return(hay);
     }
  }
void OnStart()
  {
   Test();
  }

所以我重复我关于这个例子的问题:你的意思是编译器不考虑Triple枚举的值列表和它们的总数吗? 我在switch操作符中使用了所有枚举值。

 
Yedelkin:
中间的结论如下:在使用枚举+切换时,使用默认标签成为强制性的

让我们这样想象一下(顺便说一下,数值3在明确声明数值的情况下不会起作用,但-1-很容易)。但是没有明确的变量初始化,就会显示值等于索引为0的那个值(这里的一切都是经过深思熟虑的)。

如果排除了默认选项,该函数应该返回什么?

ENUM_CHART_MODE ChartMode = -1;

string Test()
  {
   switch(ChartMode)
     {
      case 0: return("Bars"); break;
      case 1: return("CANDLES"); break;
      case 2: return("LINE"); break;      
      default: return("Unknown");
     }
  }
void OnStart()
{
Comment(Test());
}
 
Yedelkin:
中间的结论如下:在使用枚举+切换时,使用默认标签成为强制性的

是的,如果有东西需要在return()中返回的话。

或者至少使编译器能够确定该函数将返回一些东西。

bool bool_var=false;
bool Test(void)
  {
   switch(bool_var)
     {
      case  true: return(true);
      case false: return(false);
     }
    return(false);//хотя до сюда ни когда не дойдем, но прописать надо
  }
void OnStart()
  {
   Test();
  }
 
谢谢你们的科学!"。我得磨磨牙,把多余的线放进去 :)