Рассмотрим переменную x
в следующем коде:
uint32_t blah(uint32_t q, uint32_t r)
{
uint16_t x;
if (q)
x=foo(q); // Assume return type of foo() is uint16_t
if (r)
x=bar(r); // Assume return type of bar() is uint16_t
return x;
}
Так как код никогда не присваивает x
значение вне диапазона 0-65535, компилятор для 32-битного процессора может законно выделять 32-битный регистр для Это. Действительно, поскольку значение q
никогда не используется после первого использования x
, компилятор может использовать тот же регистр для хранения x
был использован для хранения q
. Обеспечение того, чтобы функция всегда возвращала значение 0-65535, потребовало бы добавления некоторых дополнительных инструкций по сравнению с простой возможностью вернуть все, что попадало в регистр, выделенный для x
.
Обратите внимание, что с точки зрения стандартных авторов, если стандарт не будет требовать, чтобы компилятор сделать x
содержать значение от 0-65535, это может также не указывать ничего о том, что может если код пытается использовать x
. Реализации, которые желают предоставить какие-либо гарантии поведения в таких случаях, свободны в этом, но Стандарт не предъявляет никаких требований.
Значение неинициализированной локальной нестатической переменной * неопределено *. * Pseudo * -случайное число, возвращаемое 'rand', является детерминированным, если вы знаете текущее семя. –
Даже если 'rand()' не генерирует предсказуемое число, во время работы оно является определенным числом, поэтому код ниже его может использовать. Это отличается от неинициализированного 'i'. – YuMS