错误、漏洞、问题 - 页 2116 1...210921102111211221132114211521162117211821192120212121222123...3184 新评论 A100 2018.02.01 13:20 #21151 函数参数 不是从右到左计算的 int i = 0; int _etLastError() { return i; } int _tringGetCharacter( string, int ) { i = 5041; return 0; } void OnStart() { string abc = "ABC"; ResetLastError(); Print( ::StringGetCharacter( abc, 1024 ), ":", GetLastError()); //(*)слева направо Print( _tringGetCharacter( abc, 1024 ), ":", _etLastError()); // справа налево } 字符串结果 (*) : 0:5041 在这两种情况下都是预期的。0:0 Koldun Zloy 2018.02.01 16:07 #21152 A100:函数参数 不是从右到左计算的 字符串结果 (*) : 0:5041 在这两种情况下,这都是意料之中的事。0:0这不是一个错误。编译器自己决定以何种顺序来计算参数。 你只要把它考虑进去就可以了。 A100 2018.02.01 16:42 #21153 Koldun Zloy:这不是一个错误。编译器自行决定以何种顺序来计算参数。错误是这样的:直到最近,顺序是由https://www.mql5.com/ru/forum/1111/page2040#comment_5858419(注意日期和文件中的摘录:保证)严格定义的。然后,这个顺序被悄悄地改变了(包括在文档中),它可以以一种文明的方式改变--通过内联https://www.mql5.com/ru/forum/1111/page2042#comment_5860752。 但是,用户应该如何了解它呢?用户应该猜测它吗?或者在使用任何工具之前,看一下文件? Ошибки, баги, вопросы 2017.10.04www.mql5.com Общее обсуждение: Ошибки, баги, вопросы A100 2018.02.01 20:56 #21154 编译错误及更多 #define MACRO( X ) #X void OnStart() { Print( MACRO( AC/DC )); //нормально Print( MACRO( AC\\DC )); //error: '\' - illegal escape sequence Print( MACRO( ABC\nDEF )); //error: '\' - illegal escape sequence Print( MACRO( 'ABC' )); //error: '' - single quote needed Print( MACRO( "ABC )); //error: '' - double quotes are needed Print( MACRO( "ABC" )); //Результат: ABC вместо "ABC" Print( MACRO( '"'ABC )); //нормально } Koldun Zloy 2018.02.02 04:27 #21155 A100:错误是这样的:直到最近,这个顺序是由https://www.mql5.com/ru/forum/1111/page2040#comment_5858419(注意日期和文件摘录:保证)严格定义的。然后,这个顺序被悄悄地改变了(包括在文档中),而且有可能以一种文明的方式改变它--通过内联https://www.mql5.com/ru/forum/1111/page2042#comment_5860752。 但是,用户应该如何了解它呢?用户应该猜测它吗?或者在使用任何工具之前先看一下文档?你只是不必写那些依赖于计算参数顺序的代码。 在C++中,编译器有权利内联一个函数,即使它没有内联关键字。 在MQL中,没有内联关键字,编译器只在它的决定下整合函数。 从右到左的计算顺序显然是由于这种顺序的参数被放在堆栈上。 但它们也可以通过寄存器传递。 而对于内置函数,根本不存在参数的传递。 A100 2018.02.02 07:14 #21156 Koldun Zloy:1.你只是不需要写那些依赖于参数计算顺序的代码。 2.在C++中,编译器有权内联一个函数,即使它没有内联关键字。 3.在MQL中,没有内联关键字,编译器只根据自己的判断嵌入函数。 4.从右到左的计算顺序似乎与参数以这种顺序放在堆栈中的事实有关。 但它们也可以通过寄存器来传递。 5.而且,内置函数根本就没有参数传递。1.如果在文档中保证了相反的顺序,而且在这种情况下,代码更简单、更清晰,为什么不应该这样呢?我们不妨否认使用5+(2*3)操作的优先级,并要求在任何地方都要加括号(5+(2*3))。- 以防突然被改变2.C++编译器对嵌入式函数提出了某些要求,这就排除了这种情况https://www.mql5.com/ru/forum/1111/page2136#comment_6454818。 3.这就是建议引入的方式4.在寄存器中(与堆栈不同),参数可以以任何顺序放置,包括相反的顺序5.重要的不是传递的顺序,而是计算参数的顺序,任何有一个以上参数的函数都是如此。而C++在使(或不使)一个函数内联之前会考虑到这一点(见第2项)。 Ошибки, баги, вопросы 2018.01.31www.mql5.com Общее обсуждение: Ошибки, баги, вопросы Koldun Zloy 2018.02.02 07:56 #21157 A100:1.为什么不呢,如果文档中保证了相反的顺序,而且代码也更简单明了。我们不妨否认使用5+(2*3),并要求在所有地方都加上括号(5+(2*3))。- 以防突然被改变2.C++编译器对嵌入式函数提出了某些要求,这就排除了这种情况https://www.mql5.com/ru/forum/1111/page2136#comment_6454818。 3.这就是建议引入的方式4.在寄存器中(与堆栈不同),参数可以以任何顺序放置,包括相反的顺序5.重要的不是传递的顺序,而是计算参数的顺序,任何有一个以上参数的函数都是如此。而C++在使(或不使)一个函数内联之前会考虑到这一点(见第2点)。3.我不知道这对你有什么好处。你想禁止编译器在没有明确指定内联的情况下嵌入函数吗?2.我不知道你是什么意思。 4.我只是在暗示那份订单和它的取消与什么有关。我不认为这是偶然的,而且从现在起将一直如此。这并不可怕。 5.你错了。在C++中,没有定义计算参数的顺序。 1.我用C++写了很多年,从未发现这是个问题。 A100 2018.02.02 08:48 #21158 Koldun Zloy:3.我不知道这对你有什么好处。你想阻止编译器在没有明确指定内联的情况下嵌入函数吗? 4.我只是建议这个订单和它的取消是为了什么。我不认为这是偶然的,现在也将永远如此。这并不可怕。 5.你错了。在C++中,计算参数的顺序是未定义的。 3.我是建议不允许编译器改变没有内联的函数的参数计算顺序。 5.计算的顺序是由实现(编译器)定义的,它是相当具体的(从右到左或从左到右),这里举例说明。 void OnStart() { ResetLastError(); Print( GetLastError(), ":", StringGetCharacter( "abc", 1024 ), ":", GetLastError()); } 不清楚哪个顺序是2-1-3或2-3-1或什么。 结果:5041:0:5041。 预计:0:0:5041从左到右或 5041:0:0 从右到左 fxsaber 2018.02.02 09:02 #21159 A100:不清楚哪种顺序是2-1-3或2-3-1或其他什么。我不明白为什么要写那些明显有歧义的代码? A100 2018.02.02 09:08 #21160 fxsaber:我不明白为什么要写那些明显有歧义的代码?有一个类似的问题要问你https://www.mql5.com/ru/forum/1111/page2037#comment_5842347 Ошибки, баги, вопросы 2017.10.02www.mql5.com Общее обсуждение: Ошибки, баги, вопросы 1...210921102111211221132114211521162117211821192120212121222123...3184 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
函数参数 不是从右到左计算的
字符串结果 (*) : 0:5041
在这两种情况下都是预期的。0:0
函数参数 不是从右到左计算的
字符串结果 (*) : 0:5041
在这两种情况下,这都是意料之中的事。0:0
这不是一个错误。编译器自己决定以何种顺序来计算参数。
你只要把它考虑进去就可以了。
这不是一个错误。编译器自行决定以何种顺序来计算参数。
错误是这样的:直到最近,顺序是由https://www.mql5.com/ru/forum/1111/page2040#comment_5858419(注意日期和文件中的摘录:保证)严格定义的。然后,这个顺序被悄悄地改变了(包括在文档中),它可以以一种文明的方式改变--通过内联https://www.mql5.com/ru/forum/1111/page2042#comment_5860752。 但是,用户应该如何了解它呢?用户应该猜测它吗?或者在使用任何工具之前,看一下文件?
编译错误及更多
错误是这样的:直到最近,这个顺序是由https://www.mql5.com/ru/forum/1111/page2040#comment_5858419(注意日期和文件摘录:保证)严格定义的。然后,这个顺序被悄悄地改变了(包括在文档中),而且有可能以一种文明的方式改变它--通过内联https://www.mql5.com/ru/forum/1111/page2042#comment_5860752。 但是,用户应该如何了解它呢?用户应该猜测它吗?或者在使用任何工具之前先看一下文档?
你只是不必写那些依赖于计算参数顺序的代码。
在C++中,编译器有权利内联一个函数,即使它没有内联关键字。
在MQL中,没有内联关键字,编译器只在它的决定下整合函数。
从右到左的计算顺序显然是由于这种顺序的参数被放在堆栈上。
但它们也可以通过寄存器传递。
而对于内置函数,根本不存在参数的传递。
1.你只是不需要写那些依赖于参数计算顺序的代码。
2.在C++中,编译器有权内联一个函数,即使它没有内联关键字。
3.在MQL中,没有内联关键字,编译器只根据自己的判断嵌入函数。
4.从右到左的计算顺序似乎与参数以这种顺序放在堆栈中的事实有关。
但它们也可以通过寄存器来传递。
5.而且,内置函数根本就没有参数传递。
1.如果在文档中保证了相反的顺序,而且在这种情况下,代码更简单、更清晰,为什么不应该这样呢?我们不妨否认使用5+(2*3)操作的优先级,并要求在任何地方都要加括号(5+(2*3))。- 以防突然被改变
2.C++编译器对嵌入式函数提出了某些要求,这就排除了这种情况https://www.mql5.com/ru/forum/1111/page2136#comment_6454818。
3.这就是建议引入的方式
4.在寄存器中(与堆栈不同),参数可以以任何顺序放置,包括相反的顺序
5.重要的不是传递的顺序,而是计算参数的顺序,任何有一个以上参数的函数都是如此。而C++在使(或不使)一个函数内联之前会考虑到这一点(见第2项)。
1.为什么不呢,如果文档中保证了相反的顺序,而且代码也更简单明了。我们不妨否认使用5+(2*3),并要求在所有地方都加上括号(5+(2*3))。- 以防突然被改变
2.C++编译器对嵌入式函数提出了某些要求,这就排除了这种情况https://www.mql5.com/ru/forum/1111/page2136#comment_6454818。
3.这就是建议引入的方式
4.在寄存器中(与堆栈不同),参数可以以任何顺序放置,包括相反的顺序
5.重要的不是传递的顺序,而是计算参数的顺序,任何有一个以上参数的函数都是如此。而C++在使(或不使)一个函数内联之前会考虑到这一点(见第2点)。
3.我不知道这对你有什么好处。你想禁止编译器在没有明确指定内联的情况下嵌入函数吗?
2.我不知道你是什么意思。
4.我只是在暗示那份订单和它的取消与什么有关。我不认为这是偶然的,而且从现在起将一直如此。这并不可怕。
5.你错了。在C++中,没有定义计算参数的顺序。
1.我用C++写了很多年,从未发现这是个问题。
3.我不知道这对你有什么好处。你想阻止编译器在没有明确指定内联的情况下嵌入函数吗?
4.我只是建议这个订单和它的取消是为了什么。我不认为这是偶然的,现在也将永远如此。这并不可怕。
5.你错了。在C++中,计算参数的顺序是未定义的。
3.我是建议不允许编译器改变没有内联的函数的参数计算顺序。
5.计算的顺序是由实现(编译器)定义的,它是相当具体的(从右到左或从左到右),这里举例说明。
不清楚哪个顺序是2-1-3或2-3-1或什么。
结果:5041:0:5041。
预计:0:0:5041从左到右或
5041:0:0 从右到左
不清楚哪种顺序是2-1-3或2-3-1或其他什么。
我不明白为什么要写那些明显有歧义的代码?
我不明白为什么要写那些明显有歧义的代码?
有一个类似的问题要问你https://www.mql5.com/ru/forum/1111/page2037#comment_5842347