Erros, bugs, perguntas - página 2860

 
É este o comportamento correcto do compilador?
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
}
Parece que A::i não é criado quando o método A::f() é chamado, que chama A::i.
 
fxsaber:
É este o comportamento correcto do compilador? Parece que A::i não é criado no momento de chamar o método A::f() chamando A::i.

O que se entende por "criado" ?

estática é apenas uma forma de criar um ancinho para esconder uma variável ou função global, limitando a visibilidade de uma função ou classe

A memória para uma variável global existe sempre.
E sim, para variáveis globais a ordem de inicialização é muito importante (evite aceder à variável antes de a inicializar)
Este exemplo funcionou...

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

No exemplo acima funcionou...

Vai mudar o compilador nesta altura? Pessoalmente, gostaria de manter as coisas como estão.

 
fxsaber:

Vai mudar o compilador nesta altura? Pessoalmente, gostaria de manter tudo como está.

Não estamos a planear mudar o comportamento.

Mas há uma tarefa diferida de detecção de erros de acesso a variáveis globais (antes da inicialização).
Se implementarmos esta funcionalidade, receberemos um aviso ao compilar o código acima: a função A::f() é utilizada para inicializar A::i, que acede à variável A::i a ser inicializada.

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

Se implementarmos a funcionalidade, receberá um aviso ao compilar o código acima: a função A::f() é utilizada para inicializar A::i, que acede à variável A::i a ser inicializada.

Obrigado!

 
Ilyas:

Não pretendemos alterar o comportamento

Depois contradiz o seu conceito de que uma variável é considerada declarada quando a declaração está completa. Porque o inventou em primeiro lugar? Se é assim num caso e diferente noutro caso

int i = i; //Error: 'i' - undeclared identifier
Uma boa língua tem regras uniformes, não o contrário
 
A100:

Depois contradiz o seu próprio conceito de que uma variável é considerada declarada quando a declaração está completa. Porque o inventou em primeiro lugar? Se assim for num caso e diferente noutro

Uma boa língua tem regras uniformes, não o contrário

Sou um ignorante total, mas não teria pensado nisso (int i = i) mesmo que tivesse bebido demais....... 8(

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

Sou um ignorante total, mas não teria pensado nisto (int i = i) mesmo que tivesse bebido demais....... 8(

E qual é a principal diferença em relação ao exemplo original? Retire coisas desnecessárias e obterá:

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

Só há muitas cordas ali, e apenas uma aqui.

Se não houver erro de compilação não deveria haver um aqui também (e vice-versa), caso contrário é uma confusão

 
A100:

Depois contradiz o seu próprio conceito de que uma variável é considerada declarada quando a declaração está completa. Porque o inventou em primeiro lugar? Se assim for num caso e diferente noutro

Uma boa língua tem regras uniformes, não o contrário
Neste caso está tudo bem.

A questão é que se pode ter um comportamento indefinido noutras condições mais complicadas. As auto-fotos em C++ são implementáveis.
 
A100:

Qual é a diferença fundamental em relação ao exemplo original? Retire o material extra e já o tem:

Só há muitas linhas ali, e apenas uma aqui

Se não houver erro de compilação não deveria haver um aqui também (e vice-versa), caso contrário é uma confusão.

Está enganado, não é a mesma coisa.

Descrição de uma variável estática numa classe é a sua pré-definição (semelhante à pré-definição de uma função ou classe), mas a localização, de facto, apenas diz ao compilador onde a variável será armazenada na memória e quando deve ser inicializada