Я не понимаю, что делает следующий пример кода и как он это делает:
#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(), но это будет означать, что порядок инициализации отменяется (я также могу ошибиться в том, что такое инициализация или когда это произойдет).