오류, 버그, 질문 - 페이지 2890

 
Roman :

이 값의 오류를 잡아야 한다면 음, 333 으로 초기화하세요))
이것은 시작 값일 뿐입니다.

당신 말이 맞아, 그것은 버그입니다. 모든 경우에 시작되지 않은 변수 할당에 대한 경고를 표시하거나 경고를 표시하지 않지만 기본적으로 예를 들어 모든 언어의 프레임워크 내에서 0으로 초기화합니다. 같은 경우.

 
Valeriy Yastremskiy :

당신 말이 맞아, 그것은 버그입니다. 모든 경우에 시작되지 않은 변수 할당 에 대한 경고를 표시하거나 경고를 표시하지 않지만 기본적으로 예를 들어 모든 언어의 프레임워크 내에서 0으로 초기화합니다. 같은 경우.

위의 예 중 어디에서만 그러한 경우를 보았습니까?

 
A100 :

위의 예 중 어디에서만 그러한 경우를 보았습니까?

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

오류, 버그, 질문

A100 , 2020.10.27 16:11

초기화가 필요하지만 의미 있는 값으로만 해야 합니다. 이 예에서는 그러한 값이 없으므로 연습이 나쁘지 않고 유일하게 가능한 것입니다. 그렇지 않으면 이중 초기화가 발생합니다.

 int f( int i ) { /*вычисления*/ }
void g( int k )
{
         for ( int i = 0 , j ; i < k; i = j )
        {
                 j = f( i ) ;
                 /*вычисления*/
        }
}

 
Roman :

그리고 시작되지 않은 변수의 할당은 어디에 있습니까? 초기화되지 않은 변수는? 그리고 누구에게 할당되었습니까? 강조 표시한 것: =에서 j=의 왼쪽으로, =j의 오른쪽이 아닌, 즉 이 할당되기 전에는 누구에게도 할당되지 않습니다.

 
A100 :

위의 예 중 어디에서만 그러한 경우를 보았습니까?

네, 흥분했습니다. 모든 경우에 초기화되지 않은 변수에 대한 할당이 있고 그 반대는 아닙니다. 아마도 컴파일러는 위에서 아래로 한 줄씩 이동한 다음 예, 할당이 맨 아래에 있고 그 반대도 맨 위에 있습니다. 같은 위치에서 초기 변수가 아닌 변수에 경고가 할당될 수 있습니다.

 
A100 :

그리고 시작되지 않은 변수의 할당은 어디에 있습니까? 초기화되지 않은 변수는? 그리고 누구에게 할당되었습니까? =j가 아니라 j=를 강조 표시했다는 사실

루프 본문에서 초기화되지 않은 변수에 대한 할당. 첫 번째 반복 전에 j는 아직 초기화되지 않았습니다.
첫 번째 반복이 지난 후에 초기화됩니다.
루프 본문이 먼저 실행된 다음 증가 영역이 실행됩니다. i = j로 대체한 것

 
Roman :

함수 본문에서 초기화되지 않은 변수에 대한 할당. 첫 번째 반복 전에 j는 아직 초기화되지 않았습니다.
첫 번째 반복이 지난 후에 초기화됩니다.
함수의 본문이 먼저 실행된 다음 증가 영역이 실행됩니다. i = j로 대체한 것

아니요, 모든 것이 정확합니다. 첫 번째 반복에서 다른 j가 초기화되지 않고 j=f(i)만 초기화되고 두 번째 반복에서는 i=j만 됩니다. 컴파일러가 위에서 아래로 구문 분석하고 경고를 제공한다고 생각합니다.

 
Valeriy Yastremskiy :

아니요, 모든 것이 정확합니다. 첫 번째 반복에서 다른 j가 초기화되지 않고 j=f(i)만 초기화되고 두 번째 반복에서는 i=j만 됩니다. 컴파일러가 위에서 아래로 구문 분석하고 경고를 제공한다고 생각합니다.

예, 하지만 첫 번째 반복 전에 변수 j가 아직 초기화되지 않았으며 컴파일러는 이에 대해 맹세합니다.

 
Valeriy Yastremskiy :

네, 흥분했습니다. 모든 경우에 초기화되지 않은 변수에 대한 할당이 있고 그 반대는 아닙니다. 아마도 컴파일러는 위에서 아래로 한 줄씩 이동한 다음 예, 할당이 맨 아래에 있고 그 반대도 맨 위에 있습니다. 같은 위치에서 초기 변수가 아닌 변수에 경고 가 할당될 수 있습니다 .

컴파일러에 객관적으로 정보가 없는 경우일 수 있습니다.

 void f( int & i ) { /*вычисления*/ }
void OnStart ()
{
         int i;
        f( i );
         int j = i; // нормально ??? а если i не инициализирована?
         printf ( "%d" ,j);
}

저것들. 아마도 f()가 i를 초기화했을 수도 있고 아닐 수도 있습니다. 그리고 여기서 C++ 컴파일러는 경고를 제공하지만 어떤 이유로 MQL은

 
A100 :

컴파일러에 객관적으로 정보가 없는 경우일 수 있습니다.

저것들. 아마도 f()가 i를 초기화했을 수도 있고 아닐 수도 있습니다. 그리고 여기서 C++ 컴파일러는 경고를 제공하지만 MQL은 그렇지 않습니다.

나는 그들이 말하는 것을 모른다. 나는 더 간단한 컴파일러를 생각한다. 하향식 레이아웃 구문을 명시적 구문으로 구문 분석합니다. 오류, 유형 비준수 및 기타 변수 사용. 두 번째 예에서 초기화가 설정되었을 때 경고가 발행되지 않았습니다. 프로그램 실행은 동일하지만.