Где используется ключевое слово 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 является оптимальным.