错误、漏洞、问题 - 页 416 1...409410411412413414415416417418419420421422423...3184 新评论 Dmitriy Skub 2011.06.15 18:53 #4151 Yedelkin: 那么,如果变量属于bool类型,原则上只有两个值,而这两个值都在switch语句中使用,那么指定default:return(false )的意义何在?换句话说,默认标签根本就不应该被执行。 P.S. 1.另外,如果我们按照你的方法,那么默认的标签就变成了强制性的,而不是可选的。 2.断点运算符在这两种情况下都是没有意义的。switch 操作符将你的bool_var 转换为一个整数类型。而编译器也不必知道这个变量有两个值。这不是在逻辑上分析算法。 Yedelkin 2011.06.15 18:57 #4152 Interesting: 你还忘了一件事--任何变量都可能有一个无效的值或未被初始化(有一个 "垃圾 "值)...... 我没有忘记。所以在我的例子中,这个变量被初始化了。尽管这样,编译器还是产生了一个错误。 bool_var=-1 的例子是极其不正确的。自己看吧。bool bool_var=-1; void OnStart() { Print("bool_var=",bool_var); } [删除] 2011.06.15 18:59 #4153 Dima_S:switch 语句将你的bool_var 转换为一个整数类型。而编译器也不需要知道这个变量有两个值。它没有从逻辑上分析该算法。顺便说一下,对于布尔运算,有一个幸运的变体,当一个未初始化的变量或一个数值为-1的变量,例如,将被铸成真/假。当然,如果你明确地将变量声明为int,这就不会发生。 耶德尔金。 我没有忘记。这就是为什么在我的例子中变量被初始化了。尽管这样,编译器还是产生了一个错误。 bool_var=-1 的例子是极其不正确的。说服你自己。我已经深信不疑,这就是我把它删除的原因。但这是一种偶然的运气(把它看作是语言的一个特点)。但在处理开关 块中可能出现的错误时,编译器不必弄清楚那里输入的是什么和如何输入的,所以编译器把它当作一个错误,而不是一个警告。 Yedelkin 2011.06.15 19:02 #4154 Dima_S: 而编译器也不需要知道这个变量有两个值。它不是在对算法进行逻辑分析。 所以你是说,编译器没有考虑到枚举中的值列表和它们的总数量? Yedelkin 2011.06.15 19:09 #4155 Interesting: 但在处理开关 块中可能出现的错误时,编译器不需要弄清楚它的输入内容和方式,所以编译器将其视为错误,而不是警告。 中间的结论如下:在使用枚举+开关时,使用默认标签成为强制性的? Dmitriy Skub 2011.06.15 19:11 #4156 Yedelkin: 1. bool已经是一个 "整数类型"。或者你是说switch是转换到更高的整数类型。 2.你是说编译器没有考虑到枚举值的列表和它们的总数?1. bool是一个整数类型,大小为一个字节。转换为int类型,你是对的。2.你在这里也是对的。只有case不是一个枚举,而只是条件分支的一个标签。 Документация по MQL5: Основы языка / Типы данных / Целые типы / Типы char, short, int и long www.mql5.com Основы языка / Типы данных / Целые типы / Типы char, short, int и long - Документация по MQL5 Yedelkin 2011.06.15 19:22 #4157 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操作符中使用了所有枚举值。 [删除] 2011.06.15 19:31 #4158 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()); } Andrey Dik 2011.06.15 19:32 #4159 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(); } Yedelkin 2011.06.15 19:38 #4160 谢谢你们的科学!"。我得磨磨牙,把多余的线放进去 :) 1...409410411412413414415416417418419420421422423...3184 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
那么,如果变量属于bool类型,原则上只有两个值,而这两个值都在switch语句中使用,那么指定default:return(false )的意义何在?换句话说,默认标签根本就不应该被执行。
P.S. 1.另外,如果我们按照你的方法,那么默认的标签就变成了强制性的,而不是可选的。
2.断点运算符在这两种情况下都是没有意义的。
switch 操作符将你的bool_var 转换为一个整数类型。
而编译器也不必知道这个变量有两个值。这不是在逻辑上分析算法。
你还忘了一件事--任何变量都可能有一个无效的值或未被初始化(有一个 "垃圾 "值)......
我没有忘记。所以在我的例子中,这个变量被初始化了。尽管这样,编译器还是产生了一个错误。
bool_var=-1 的例子是极其不正确的。自己看吧。
switch 语句将你的bool_var 转换为一个整数类型。
而编译器也不需要知道这个变量有两个值。它没有从逻辑上分析该算法。
顺便说一下,对于布尔运算,有一个幸运的变体,当一个未初始化的变量或一个数值为-1的变量,例如,将被铸成真/假。
当然,如果你明确地将变量声明为int,这就不会发生。
我没有忘记。这就是为什么在我的例子中变量被初始化了。尽管这样,编译器还是产生了一个错误。
bool_var=-1 的例子是极其不正确的。说服你自己。
我已经深信不疑,这就是我把它删除的原因。但这是一种偶然的运气(把它看作是语言的一个特点)。
但在处理开关 块中可能出现的错误时,编译器不必弄清楚那里输入的是什么和如何输入的,所以编译器把它当作一个错误,而不是一个警告。
而编译器也不需要知道这个变量有两个值。它不是在对算法进行逻辑分析。
所以你是说,编译器没有考虑到枚举中的值列表和它们的总数量?
但在处理开关 块中可能出现的错误时,编译器不需要弄清楚它的输入内容和方式,所以编译器将其视为错误,而不是警告。
1. bool已经是一个 "整数类型"。或者你是说switch是转换到更高的整数类型。
2.你是说编译器没有考虑到枚举值的列表和它们的总数?
1. bool是一个整数类型,大小为一个字节。转换为int类型,你是对的。
2.你在这里也是对的。只有case不是一个枚举,而只是条件分支的一个标签。
1. bool是一个一字节的整数类型。转换到int类型,你是对的。
根据《手册》,bool是除整数以外的特殊类型...所以我删除了我的不正确的声明。虽然我不打算争论--我不是专家。
Dima_S:
所以你的意思是,编译器不考虑来自枚举的值列表和它们的总数量?
2.你在这里写得也很正确。只有case不是一个枚举,而只是一个条件分支的标签。
我指的是枚举(考虑到bool类型是最小的),而不是案例标签。下面是一个具有相同编译错误的例子。
所以我重复我关于这个例子的问题:你的意思是编译器不考虑Triple枚举的值列表和它们的总数吗? 我在switch操作符中使用了所有枚举值。
中间的结论如下:在使用枚举+切换时,使用默认标签成为强制性的?
让我们这样想象一下(顺便说一下,数值3在明确声明数值的情况下不会起作用,但-1-很容易)。但是没有明确的变量初始化,就会显示值等于索引为0的那个值(这里的一切都是经过深思熟虑的)。
如果排除了默认选项,该函数应该返回什么?
中间的结论如下:在使用枚举+切换时,使用默认标签成为强制性的?
是的,如果有东西需要在return()中返回的话。
或者至少使编译器能够确定该函数将返回一些东西。