Где используется ключевое слово C auto?
В мои дни колледжа я читал о ключевом слове auto
, и с течением времени я фактически забыл, что это такое. Он определяется как:
определяет локальную переменную как имеющую местное время жизни
Я не нашел, что он используется где-нибудь, действительно ли он используется, и если да, то где он используется и в каких случаях?
Ответы
Ответ 1
auto
является модификатором типа static
. Он определяет класс хранения переменной. Однако, поскольку значение по умолчанию для локальных переменных равно auto
, вам обычно не нужно вручную указывать его.
На этой странице перечислены различные классы хранения в C.
Ответ 2
Если вы читаете список IAQ (редко задаваемые вопросы), вы должны знать, что авто полезно в первую очередь для определения или объявить транспортное средство:
auto my_car;
Автомобиль, который постоянно припаркован на открытом воздухе:
extern auto my_car;
Для тех, кому не хватает чувства юмора и хочет "просто факты мэм": короткий ответ заключается в том, что никогда не было причин использовать auto
вообще. Единственный раз, когда вам разрешено использовать auto
, есть переменная, у которой уже есть класс хранения auto
, поэтому вы просто указываете что-то, что произойдет в любом случае. Попытка использовать auto
для любой переменной, у которой нет класса хранения auto
, уже приведет к отказу компилятора от вашего кода. Я полагаю, что если вы хотите получить техническую информацию, ваша реализация не обязательно должна быть компилятором (но она есть), и она теоретически может продолжить компиляцию кода после выдачи диагностики (но это не будет).
Малое добавление kaz:
Существует также:
static auto my_car;
который требует диагностики в соответствии с ISO C. Это правильно, потому что он заявляет, что автомобиль разбит. Диагностика бесплатна, но выключение света приборной панели обойдется вам в восемьдесят долларов. (Двадцать или меньше, если вы приобретаете собственный USB-ключ для бортовой диагностики с eBay).
Вышеупомянутый extern auto my_car
также требует диагностики, и по этой причине он никогда не запускается через компилятор, за исключением городского персонала, которому поручено обеспечение парковки.
Если вы видите много extern static auto ...
в любой базе кода, вы находитесь в плохом районе; ищите лучшую работу сразу, прежде чем все место превратится в Rust.
Ответ 3
Ключевое слово auto
бесполезно на языке C. Это происходит потому, что перед языком C существовал язык B, в котором это ключевое слово было необходимо для объявления локальных переменных. (B был разработан в NB, который стал C).
Вот справочное руководство для B.
Как вы можете видеть, руководство содержит примеры, в которых используется auto
. Это связано с тем, что ключевое слово int
отсутствует. Некоторое ключевое слово необходимо, чтобы сказать "это объявление переменной", и это ключевое слово также указывает, является ли оно локальным или внешним (auto
versus extrn
). Если вы не используете тот или иной, у вас есть синтаксическая ошибка. То есть x, y;
не является объявлением, но auto x, y;
есть.
Так как базы кода, написанные в B, должны были быть перенесены на NB и на C, поскольку язык был разработан, более новые версии языка несли некоторый багаж для улучшения обратной совместимости, который был переведен на меньшую работу. В случае auto
программистам не нужно было выслеживать каждое событие auto
и удалять его.
Из руководства видно, что теперь устаревший "неявный int" cruft в C (возможность писать main() { ... }
без каких-либо int
впереди) также исходит из B. Это другая функция обратной совместимости для поддержки B-кода. Функции не имеют типа возврата, указанного в B, потому что нет типов. Все это слово, как на многих языках ассемблера.
Обратите внимание, как можно просто объявить функцию extrn putchar
, а затем единственное, что делает ее функцией, которую идентификатор использует: он используется в выражении функции, например putchar(x)
, и что что говорит компилятору рассматривать это беспринципное слово как указатель функции.
Ответ 4
В C auto
- это ключевое слово, которое указывает, что переменная является локальной для блока. Поскольку это значение по умолчанию для переменных с блочным диапазоном, это ненужно и очень редко используется (я не думаю, что когда-либо видел, чтобы он использовался за пределами примеров в текстах, которые обсуждают ключевое слово). Мне было бы интересно, если бы кто-нибудь мог указать случай, когда использование auto
было необходимо для правильного разбора или поведения.
Однако в стандарте С++ 11 ключевое слово auto
было "захвачено" для поддержки вывода типа, где тип переменной можно взять из типа его инициализатора:
auto someVariable = 1.5; // someVariable will have type double
Ввод типа добавляется главным образом для поддержки объявления переменных в шаблонах или возврата из функций шаблона, где типы, основанные на параметре шаблона (или выведенные компилятором при создании экземпляра шаблона), часто могут быть довольно болезненными для объявления вручную.
Ответ 5
Со старым компилятором Aztec C можно было превратить все автоматические переменные в статические переменные (для увеличения скорости адресации) с помощью командной строки.
Но переменные, явно объявленные с помощью auto
, были оставлены как-в этом случае. (Обязательно для рекурсивных функций, которые иначе не работали бы правильно!)
Ответ 6
Ключевое слово auto
похоже на включение точек с запятой в Python, это требовалось предыдущему языку (B
) но разработчики поняли, что это избыточно, потому что большинство вещей было auto
.
Я подозреваю, что он остался, чтобы помочь с переходом от B к C. Короче говоря, одно использование - для совместимости с B.
Например, в B и 80s C:
/* The following function will print a non-negative number, n, to
the base b, where 2<=b<=10. This routine uses the fact that
in the ASCII character set, the digits 0 to 9 have sequential
code values. */
printn(n, b) {
extrn putchar;
auto a;
if (a = n / b) /* assignment, not test for equality */
printn(a, b); /* recursive */
putchar(n % b + '0');
}
Ответ 7
Автоматическое ключевое слово - это класс хранения (некоторые методы, которые определяют время жизни переменной и место хранения). Он имеет поведение, при котором переменная, созданная с помощью справки этого ключевого слова, имеет продолжительность жизни (время жизни) только внутри фигурных скобок
{
auto int x=8;
printf("%d",x); // here x is 8
{
auto int x=3;
printf("%d",x); // here x is 3
}
printf("%d",x); // here x is 8
}
Ответ 8
auto
полезно сказать, что вы не хотите, чтобы он был register
.
Однако это часто бесполезно, поскольку компилятор ставит register
, когда
не было использовано, и он считает, что он оптимален, и он будет редко думать так неправильно, однако он часто пропускает, что register
является оптимальным.