Должны ли переменные всегда быть инициализированы литералами? - PullRequest
1 голос
/ 06 июня 2019
main()
{
    int a = 5, b = a, sum;
    sum = a + b;
    printf("sum is %d",sum);
}

В этой программе на C будет ли инициализироваться переменная b во время компиляции или во время выполнения?
Это инициализация времени компиляции?
(Язык C)

Ответы [ 2 ]

2 голосов
/ 06 июня 2019

Нет, переменные не всегда должны быть инициализированы литералами, хотя некоторые люди любят гарантировать, что переменные инициализируются в точке объявления (а некоторые фирмы настаивают на этом), чтобы избежать чтения неинициализированных переменных в плохо сформированном коде.

Как и для любого поведения во время выполнения: применяется правило как если бы .Ваш исходный код просто описывает то, что вы хотите, чтобы поведение было, а не машинный код, который будет сгенерирован.Ваши переменные, вероятно, не будут существовать в скомпилированном двоичном файле, который будет эквивалентен

int main()
{
    printf("sum is %d", 10);
}

(Выражение int a = 5, b = a четко определено, поскольку , является точкой последовательности, поэтому инициализируется aв то время как его значение считывается для присвоения b.)

1 голос
/ 06 июня 2019

зависит от того, реализован ли компилятором / интерпретатором алгоритм постоянного распространения или нет.

C стандарт не навязывает не использовать постоянное распространение. Если обнаруживается, что эта переменная не является мутированной, ее можно заменить на предварительно вычисленное значение. Правило как-будто гласит, что можно проводить любую оптимизацию, которую мы хотим, поскольку время является ожидаемым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...