Я не понимаю, что делает следующий пример кода и как он это делает:
#include <stdio.h>
int f();
int a = f(); // a exists just to call f
int x = 22;
int f() {
++x;
return 123; // unimportant arbitrary number
}
int main() {
printf("%d\n", x);
}
Когда это выполняется, он печатает 23
, что является интуитивным ответом.
Однако в С++ глобальные переменные должны быть инициализированы в порядке определения. Это означало бы, что a
должен быть инициализирован до x
, потому что он определен до x
. Если это так, то функция f
должна была бы быть вызвана до того, как был инициализирован x
, потому что вызов f
является частью определения a
.
Если f
действительно вызывается до инициализации x
, это означает, что f
будет пытаться увеличивать x
- результат, на который я не уверен (скорее всего UB, или некоторое значение тарабарщины). Затем, после инициализации a
, x
будет инициализироваться на 22
, и программа распечатает 22
.
Очевидно, что не то, что происходит. Но что? Что делает этот код на самом деле?
Кажется, что x
установлен в 22
до того, как оценивается a = f()
, но это будет означать, что порядок инициализации отменяется (я также могу ошибиться в том, что такое инициализация или когда это произойдет).