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

 
이것이 올바른 컴파일러 동작입니까?
 class A
{
public :
   static int i;
  
   static int f()
  {
    A::i = 123 ;
    
     return (A::i);
  }
};

static int A::i = A::f();

void OnStart ()
{
   Alert (A::i); // 123
}
A::i가 액세스되는 A::f() 메서드를 호출할 때 A::i가 생성되지 않은 것 같습니다.
 
fxsaber :
이것이 올바른 컴파일러 동작입니까? A::i가 액세스되는 A::f() 메서드를 호출할 때 A::i가 생성되지 않은 것 같습니다.

"창조"라는 단어는 무엇을 의미합니까?

static은 전역 변수나 함수를 숨기기 위한 갈퀴를 만드는 방법일 뿐이며, 함수나 클래스의 범위에 대한 가시성을 제한합니다.

전역 변수에 대한 메모리는 항상 존재합니다.
그리고 예, 초기화 순서는 전역 변수에 대해 매우 중요합니다(어떤 의미에서 초기화되기 전에 변수에 액세스하는 것을 피하기 위해)
위의 예에서 롤링되었습니다 ...

Документация по MQL5: Основы языка / Переменные / Создание и уничтожение объектов
Документация по MQL5: Основы языка / Переменные / Создание и уничтожение объектов
  • www.mql5.com
После загрузки на исполнение mql5-программы каждой переменной выделяется память в соответствие с типом переменной. Переменные делятся на два типа по уровню доступа - глобальные переменные и локальные переменные, и по классам памяти: входные параметры mql5-программы, статические и автоматические. Каждая переменная при необходимости...
 
Ilyas :

위의 예에서 롤링되었습니다 ...

여기에서 컴파일러를 변경하시겠습니까? 개인적으로, 나는 물건이 그대로 유지되기를 바랍니다.

 
fxsaber :

여기에서 컴파일러를 변경하시겠습니까? 개인적으로, 나는 물건이 그대로 유지되기를 바랍니다.

우리는 우리의 행동을 바꿀 계획이 없습니다.

그러나 전역 변수 에 대한 액세스 오류를 감지하는 지연 작업이 있습니다(초기화 전).
이 기능을 구현하면 위의 코드를 컴파일할 때 경고를 받게 됩니다. A::i를 초기화하려면 A::f() 함수가 사용되며 여기서 초기화된 변수 A::i에 액세스합니다.

Документация по MQL5: Основы языка / Переменные / Глобальные переменные
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
  • www.mql5.com
Глобальные переменные создаются путем размещения их объявлений вне описания какой-либо функции. Глобальные переменные определяются на том же уровне, что и функции, т. е. не локальны ни в каком блоке. Область видимости глобальных переменных - вся программа, глобальные переменные доступны из всех функций, определенных в программе...
 
Ilyas :

이 기능을 구현하면 위의 코드를 컴파일할 때 경고를 받게 됩니다. A::i를 초기화하려면 A::f() 함수가 사용되며 여기서 초기화된 변수 A::i에 액세스합니다.

고맙습니다!

 
Ilyas :

우리는 행동을 변경할 계획이 없습니다

그러면 선언이 완료된 순간부터 변수가 선언된 것으로 간주된다는 자신의 개념과 모순됩니다. 그렇다면 왜 그것을 발명합니까? 한 경우에 그리고 다른 경우 - 다르게

 int i = i; // Error: 'i' - undeclared identifier
좋은 언어에는 일정한 규칙이 있으며 그 반대도 마찬가지입니다.
 
A100 :

그러면 선언이 완료된 순간부터 변수가 선언된 것으로 간주된다는 자신의 개념과 모순됩니다. 그렇다면 왜 그것을 발명합니까? 한 경우에 그리고 다른 경우 - 다르게

좋은 언어에는 일정한 규칙이 있으며 그 반대도 마찬가지입니다.

사실은 일반인이지만 술을 마셔도 그런 생각(int i = i)은 하지 않았을 텐데....... 8(

 
Сергей Таболин :

사실은 일반인이지만 술을 마셔도 그런 생각(int i = i)은 하지 않았을 텐데....... 8(

그리고 원래 예제 와 근본적인 차이점은 무엇입니까? 초과분을 제거하고 다음을 얻습니다.

 int i = i = 123 ; // Error: 'i' - undeclared identifier

줄만 잔뜩 있는데 여기는 딱 한 줄

컴파일 오류가 없으면 여기에 있어서는 안되며 그 반대도 마찬가지입니다. 그렇지 않으면 엉망입니다.

 
A100 :

그러면 선언이 완료된 순간부터 변수가 선언된 것으로 간주된다는 자신의 개념과 모순됩니다. 그렇다면 왜 그것을 발명합니까? 한 경우에 그리고 다른 경우 - 다르게

좋은 언어에는 일정한 규칙이 있으며 그 반대도 마찬가지입니다.
이 경우 모든 것이 정상입니다.

다른 더 까다로운 조건, 정의되지 않은 동작에서 얻을 수 있는 것에 관한 것입니다. C++의 석궁은 실현 가능합니다.
 
A100 :

그리고 원래 예제 와 근본적인 차이점은 무엇입니까? 초과분을 제거하고 다음을 얻습니다.

줄만 잔뜩 있는데 여기는 딱 한 줄

컴파일 오류가 없으면 여기에 있어서는 안되며 그 반대도 마찬가지입니다. 그렇지 않으면 엉망입니다.

당신은 틀렸습니다, 그들은 동일하지 않습니다.

클래스에서 정적 변수의 선언은 사전 선언(함수 또는 클래스의 사전 선언과 유사)이지만 실제로 배치는 컴파일러에게 변수가 메모리에 저장될 위치와 시간만 알려줍니다. 초기화해야 합니다