Ваш учитель ошибается, но не полностью.
Переменные, объявленные внутри функции, по умолчанию auto
, а не static
.
int foo(void) {
static int x;
int y;
auto int z;
/* ...other code... */
}
Это означает, что в функции выше y
является автоматической, так же, как г, даже если auto
ключевое слово не используется в его заявлении. К слову, ключевое слово auto
почти не используется.Многие программисты на языке C (и C) даже не знают, что auto
- это ключевое слово, потому что оно используется так редко.
Быть переменной auto
обычно означает, что переменная хранится в системном стеке программы или в регистрах или в некотором их сочетании. Он может находиться в разных местах в разное время во время выполнения функции, а локальные переменные, которые находятся в регистре, часто выталкиваются в стек при вызове другой функции. Некоторые локальные переменные могут даже оптимизироваться, что означает, что в какой-то момент компилятор смог определить, что будущая ценность конкретной переменной больше не нужна для удовлетворения входных потребностей будущего кода (или переменная не изменяется и ее значение просто закодирован в инструкциях). Это усложняет использование отладчиков на оптимизированном коде.
Когда вы берете адрес локальной переменной, компилятор затем пытается заблокировать его до определенного адреса (возможно, сохраняя его в стеке).
Когда большинство компиляторов просматривают ваш код, они будут видеть, что имена этих локальных переменных не используются после их объявления и могут решить не хранить их значения нигде. Даже если он сохраняет эти значения в стеке, он может также нажимать другие значения в стеке перед настройкой для вызова printf
. Так же, как компилятор не должен содержать переменные, которые вы назвали, он также может создавать собственные временные переменные.
Итак, ваш вопрос ...? –
Получите нового учителя. Если он говорит что-то другое, кроме «это неопределенное поведение, не делайте этого», он не знает, о чем говорит. – JeremyP
@ Daniel Standage, что логически правильно? – Parikshita