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