错误、漏洞、问题 - 页 2116

 

函数参数 不是从右到左计算的

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

 
A100:

函数参数 不是从右到左计算的

字符串结果 (*) : 0:5041

在这两种情况下,这都是意料之中的事。0:0

这不是一个错误。编译器自己决定以何种顺序来计算参数。

你只要把它考虑进去就可以了。

 
Koldun Zloy:

这不是一个错误。编译器自行决定以何种顺序来计算参数。

错误是这样的:直到最近,顺序是由https://www.mql5.com/ru/forum/1111/page2040#comment_5858419(注意日期和文件中的摘录:保证)严格定义的。然后,这个顺序被悄悄地改变了(包括在文档中),它可以以一种文明的方式改变--通过内联https://www.mql5.com/ru/forum/1111/page2042#comment_5860752。 但是,用户应该如何了解它呢?用户应该猜测它吗?或者在使用任何工具之前,看一下文件?

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • 2017.10.04
  • www.mql5.com
Общее обсуждение: Ошибки, баги, вопросы
 

编译错误及更多

#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   )); //нормально
}
 
A100:

错误是这样的:直到最近,这个顺序是由https://www.mql5.com/ru/forum/1111/page2040#comment_5858419(注意日期和文件摘录:保证)严格定义的。然后,这个顺序被悄悄地改变了(包括在文档中),而且有可能以一种文明的方式改变它--通过内联https://www.mql5.com/ru/forum/1111/page2042#comment_5860752。 但是,用户应该如何了解它呢?用户应该猜测它吗?或者在使用任何工具之前先看一下文档?

你只是不必写那些依赖于计算参数顺序的代码。

在C++中,编译器有权利内联一个函数,即使它没有内联关键字。

在MQL中,没有内联关键字,编译器只在它的决定下整合函数。

从右到左的计算顺序显然是由于这种顺序的参数被放在堆栈上。

但它们也可以通过寄存器传递。

而对于内置函数,根本不存在参数的传递。

 
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.31
  • www.mql5.com
Общее обсуждение: Ошибки, баги, вопросы
 
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++写了很多年,从未发现这是个问题。


 
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 从右到左

 
A100:

不清楚哪种顺序是2-1-3或2-3-1或其他什么。

我不明白为什么要写那些明显有歧义的代码?

 
fxsaber:

我不明白为什么要写那些明显有歧义的代码?

有一个类似的问题要问你https://www.mql5.com/ru/forum/1111/page2037#comment_5842347

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • 2017.10.02
  • www.mql5.com
Общее обсуждение: Ошибки, баги, вопросы