오류, 버그, 질문 - 페이지 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/en/forum/1111/page2037#comment_5842347

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