Errores, fallos, preguntas - página 2860

 
¿Es este el comportamiento correcto del 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 no se crea cuando se llama al método A::f(), que llama a A::i.
 
fxsaber:
¿Es este el comportamiento correcto del compilador? Parece que A::i no se crea en el momento de llamar al método A::f() que llama a A::i.

¿Qué se entiende por "creado"?

static es sólo una forma de crear un rastrillo para ocultar una variable o función global, limitando la visibilidad de una función o clase

La memoria para una variable global siempre existe.
Y sí, para las variables globales el orden de inicialización es muy importante (me refiero a evitar acceder a la variable antes de que esté inicializada)
Este ejemplo funcionó...

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

En el ejemplo anterior ha funcionado...

¿Vas a cambiar el compilador a estas alturas? Personalmente, me gustaría mantenerlo como está.

 
fxsaber:

¿Cambiará el compilador en este punto? Personalmente, me gustaría mantener todo como está.

No pensamos cambiar el comportamiento.

Pero existe una tarea diferida de detección de errores de acceso a variables globales (antes de la inicialización).
Si implementamos esta función, obtendremos una advertencia al compilar el código anterior: la función A::f() se utiliza para inicializar A::i, que accede a la variable A::i que se está inicializando.

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

Si implementamos la función, recibirá una advertencia al compilar el código anterior: la función A::f() se utiliza para inicializar A::i, que accede a la variable A::i que se está inicializando.

Gracias.

 
Ilyas:

No tenemos previsto cambiar el comportamiento

Entonces contradice su concepto de que una variable se considera declarada cuando la declaración está completa. ¿Por qué lo inventó en primer lugar? Si es así en un caso y diferente en otro

int i = i; //Error: 'i' - undeclared identifier
Una buena lengua tiene reglas uniformes, no al revés
 
A100:

Entonces contradice su propio concepto de que una variable se considera declarada cuando la declaración está completa. ¿Por qué lo inventó en primer lugar? Si es así en un caso y diferente en otro

Una buena lengua tiene reglas uniformes, no al revés

Soy un ignorante total, pero no se me habría ocurrido (int i = i) aunque hubiera bebido demasiado....... 8(

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

Soy un ignorante total, pero no se me habría ocurrido esto (int i = i) aunque hubiera bebido demasiado....... 8(

¿Y cuál es la principal diferencia con el ejemplo original? Elimina las cosas innecesarias y lo conseguirás:

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

Sólo que allí hay muchos hilos y aquí sólo uno.

Si no hay error de compilación no debería haber ninguno aquí también (y viceversa), de lo contrario es un lío

 
A100:

Entonces contradice su propio concepto de que una variable se considera declarada cuando la declaración está completa. ¿Por qué lo inventó en primer lugar? Si es así en un caso y diferente en otro

Una buena lengua tiene reglas uniformes, no al revés
En este caso está bien.

La cuestión es que se puede obtener un comportamiento indefinido en otras condiciones más complicadas. Los autodisparos en C++ son implementables.
 
A100:

¿Cuál es la diferencia fundamental con el ejemplo original? Quita lo que sobra y ya lo tienes:

Sólo que hay muchas líneas allí, y sólo una aquí

Si no hay error de compilación no debería haberlo aquí también (y viceversa), de lo contrario es un lío.

Te equivocas, no es lo mismo.

La descripción de una variable estática en una clase es su pre-definición (similar a la pre-definición de una función o clase), pero la ubicación, de hecho, sólo indica al compilador dónde se almacenará la variable en la memoria y cuándo debe ser inicializada