错误、漏洞、问题 - 页 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::f()方法时,A::i并没有被创建,该方法调用A::i。
 
fxsaber:
这是正确的编译器行为吗?似乎在调用A::f()方法的那一刻,A::i并没有被创建。

什么叫 "创造"?

static只是一种创建耙子 来隐藏全局变量或函数的方法,限制了函数或类的可见性

全局变量的内存始终存在。
是的,对于全局变量来说,初始化顺序 是非常重要的(我的意思是,避免在变量被初始化之前访问它)
这个例子成功了...

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

在上面的例子中,它工作了...

你打算在这个时候改变编译器吗?就个人而言,我希望保持现状。

 
fxsaber:

你会在这个时候改变编译器吗?就个人而言,我希望保持一切原样。

我们不打算改变这种行为。

但是有一个延迟的任务,即检测对全局变量 的访问错误(在初始化之前)。
如果我们实现了这个功能,在编译上面的代码时我们会得到一个警告:A::f()函数被用来初始化A::i,它访问了被初始化的A::i变量。

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

如果我们实现了这个功能,在编译上述代码时,你会得到一个警告:A::f()函数被用来初始化A::i,它访问了被初始化的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:

原来的例子 有什么根本区别?去掉多余的东西,你就可以得到它。

只是那里有很多线条,而这里只有一条。

如果没有编译错误,这里也不应该有(反之亦然),否则就会一团糟。

你错了,这不是一回事。

类中静态变量的描述是它的预定义(类似于函数或类的预定义),但事实上,位置只是告诉编译器该变量在内存中的存储位置,以及它应该何时被初始化。