Na studiach czytałem o tym auto
słowie kluczowym iz biegiem czasu właściwie zapomniałem, co to jest. Jest definiowany jako:
definiuje zmienną lokalną jako posiadającą lokalny okres istnienia
Nigdy nie stwierdziłem, że jest nigdzie używany, czy naprawdę jest używany, a jeśli tak, to gdzie jest używany i w jakich przypadkach?
auto
można określić, ale nie nastąpi to domyślnie?auto
. tigcc.ticalc.org/doc/keywords.html#auto_Thread_local
szczegóły: en.cppreference.com/w/c/language/storage_duration i stackoverflow.com/a/14289720/6557621Jeśli przeczytałeś listę IAQ (rzadko zadawane pytania), wiedziałbyś, że auto jest przydatne przede wszystkim do definiowania lub deklarowania pojazdu:
Pojazd, który konsekwentnie parkuje na zewnątrz:
Dla tych, którym brakuje poczucia humoru i chcą „tylko faktów proszę pani”: krótka odpowiedź brzmi: nigdy nie ma żadnego powodu, by używać
auto
. Możesz używaćauto
tylko zmiennej, która ma jużauto
klasę pamięci, więc po prostu określasz coś, co i tak by się stało. Próba użyciaauto
dowolnej zmiennej, która nie ma jeszczeauto
klasy pamięci, spowoduje odrzucenie kodu przez kompilator. Przypuszczam, że jeśli chcesz uzyskać informacje techniczne, Twoja implementacja nie musi być kompilatorem (ale tak jest) i teoretycznie może kontynuować kompilację kodu po wydaniu diagnostyki (ale nie będzie).Mały dodatek autorstwa kaz :
Jest również:
co wymaga diagnostyki wg ISO C. To prawda, bo deklaruje, że auto jest zepsute. Diagnostyka jest bezpłatna, ale wyłączenie lampki na desce rozdzielczej kosztuje osiemdziesiąt dolarów. (Dwadzieścia lub mniej, jeśli kupisz własny klucz USB do diagnostyki pokładowej w serwisie eBay).
Wymienione wyżej
extern auto my_car
również wymaga diagnostyki iz tego powodu nigdy nie jest uruchamiane przez kompilator inaczej niż przez pracowników miejskich zajmujących się egzekwowaniem przepisów parkingowych.Jeśli widzisz dużo
extern static auto ...
w jakiejkolwiek bazie kodu, jesteś w złym sąsiedztwie; natychmiast poszukaj lepszej pracy, zanim całe miejsce zmieni się w Rust.źródło
char auto my_car;
Słowo
auto
kluczowe jest bezużyteczne w języku C. Jest tak, ponieważ przed językiem C istniał język B, w którym to słowo kluczowe było niezbędne do deklarowania zmiennych lokalnych. (B rozwinęło się w NB, które stało się C).Oto instrukcja odniesienia dla B .
Jak widać, podręcznik jest bogaty w przykłady, w jakich
auto
jest używany. Dzieje się tak, ponieważ nie maint
słowa kluczowego. Potrzebny jest jakiś rodzaj słowa kluczowego, aby powiedzieć „to jest deklaracja zmiennej”, a to słowo kluczowe wskazuje również, czy jest to lokalna, czy zewnętrzna (auto
versusextrn
). Jeśli nie używasz jednego lub drugiego, masz błąd składniowy. Oznacza to, żex, y;
nie jest deklaracją samą w sobie, aleauto x, y;
jest.Ponieważ podstawy kodu napisane w B musiały zostać przeniesione do NB i C w miarę rozwoju języka, nowsze wersje języka niosły pewien bagaż dla poprawy kompatybilności wstecznej, co przekładało się na mniej pracy. W przypadku programu
auto
programiści nie musieli wytropić każdego wystąpieniaauto
i go usunąć.Z podręcznika jasno wynika, że obecnie przestarzały cruft „implicit int” w C (możliwość pisania
main() { ... }
bez żadnegoint
z przodu) również pochodzi z B. To kolejna funkcja wstecznej kompatybilności obsługująca kod B. Funkcje nie mają typu zwracanego określonego w B, ponieważ nie ma typów. Wszystko jest słowem, jak w wielu językach asemblera.Zwróć uwagę, jak funkcja może być po prostu zadeklarowana,
extrn putchar
a następnie jedyna rzecz, która czyni ją funkcją używaną przez identyfikator : jest używana w wyrażeniu wywołania funkcji, takim jakputchar(x)
, i to właśnie mówi kompilatorowi, aby traktował to słowo bez typu jako wskaźnik funkcji.źródło
W C
auto
jest słowem kluczowym, które wskazuje, że zmienna jest lokalna dla bloku. Ponieważ jest to wartość domyślna dla zmiennych o zasięgu blokowym, jest niepotrzebna i bardzo rzadko używana (nie sądzę, żebym kiedykolwiek widziała jej użycie poza przykładami w tekstach omawiających słowo kluczowe). Byłbym zainteresowany, gdyby ktoś mógł wskazać przypadek, w którym użycieauto
było wymagane do uzyskania poprawnej analizy lub zachowania.Jednak w standardzie C ++ 11
auto
słowo kluczowe zostało `` przejęte '' w celu obsługi wnioskowania o typie, gdzie typ zmiennej można pobrać z typu jej inicjatora:Wnioskowanie o typie jest dodawane głównie w celu obsługi deklarowania zmiennych w szablonach lub zwracanych z funkcji szablonu, gdzie typy oparte na parametrach szablonu (lub wywnioskowane przez kompilator podczas tworzenia wystąpienia szablonu) często mogą być dość uciążliwe do ręcznego zadeklarowania.
źródło
auto
dotyczy klasy pamięci, która nie ma nic wspólnego z widocznością.W starym kompilatorze Aztec C możliwe było przekształcenie wszystkich zmiennych automatycznych w zmienne statyczne (w celu zwiększenia szybkości adresowania) za pomocą przełącznika wiersza polecenia.
Ale zmienne wyraźnie zadeklarowane za pomocą
auto
zostały w tym przypadku pozostawione bez zmian. (Konieczność dla funkcji rekurencyjnych, które w innym przypadku nie działałyby poprawnie!)źródło
Słowo
auto
kluczowe jest podobne do włączania średników w Pythonie, było wymagane przez poprzedni język (B
), ale programiści zdali sobie sprawę, że jest zbędne, ponieważ większość rzeczy byłoauto
.Podejrzewam, że pozostawiono go, aby pomóc w przejściu z B do C. Krótko mówiąc, jednym z zastosowań jest zgodność z językiem B.
Na przykład w B i 80s C:
źródło
Słowo kluczowe Auto to przykład klasy pamięci (pewnego rodzaju techniki, która decyduje o czasie życia zmiennej i miejscu przechowywania). Ma zachowanie, w wyniku którego zmienna utworzona przez Pomoc tego słowa kluczowego ma długość życia (czas życia) znajduje się tylko w nawiasach klamrowych
źródło
auto
może być używany tylko dla zmiennych o zasięgu blokowym.extern auto int
jest bzdurą, ponieważ kompilator nie może określić, czy używa zewnętrznej definicji, czy też nadpisać extern definicją automatyczną (również auto i extern to zupełnie inne czasy przechowywania, na przykładstatic auto int
, co oczywiście jest również bzdurą). Zawsze może zinterpretować to w jeden sposób, ale zamiast tego traktuje to jako błąd.Jest jedna funkcja, która
auto
to zapewnia i która umożliwia zastosowanie reguły „wszystko jest int” wewnątrz funkcji. Inaczej niż poza funkcją, gdziea=3
jest interpretowane jako definicja,int a =3
ponieważ przypisania nie istnieją w zakresie pliku,a=3
jest to błąd wewnątrz funkcji, ponieważ najwyraźniej kompilator zawsze interpretuje to jako przypisanie do zmiennej zewnętrznej, a nie definicję (nawet jeśli Brakextern int a
terminowe deklaracje w funkcji lub w zakresie plików), ale specifier jakstatic
,const
,volatile
czyauto
oznaczałoby, że jest to definicja i kompilator wykonuje go jako definicji, z wyjątkiemauto
nie ma skutków ubocznych innych specyfikatorów.auto a=3
jest zatem pośrednioauto int a = 3
. Wprawdzie,signed a = 3
ma ten sam efekt iunsigned a = 3
zawsze jest intem bez znaku.Należy również zauważyć, że ``
auto
nie ma wpływu na to, czy obiekt zostanie przydzielony do rejestru (chyba że jakiś konkretny kompilator zwróci na to uwagę, ale wydaje się to mało prawdopodobne) ''źródło
Jestem pewien, że znasz specyfikatory klasy pamięci w C, którymi są „extern”, „static”, „register” i „auto”. Definicja „auto” jest prawie podana w innych odpowiedziach, ale tutaj jest możliwe użycie słowa kluczowego „auto”, którego nie jestem pewien, ale myślę, że jest zależne od kompilatora. Widzisz, w odniesieniu do specyfikatorów klas pamięci istnieje reguła. Nie możemy użyć wielu specyfikatorów klasy pamięci dla zmiennej. Z tego powodu statyczne zmienne globalne nie mogą być zewnętrzne. Dlatego są znane tylko w ich aktach. Po przejściu do ustawień kompilatora możesz włączyć flagę optymalizacji dla szybkości. jednym ze sposobów optymalizacji kompilatora jest szuka zmiennych bez specyfikatorów klasy pamięci, a następnie dokonuje oceny na podstawie dostępności pamięci podręcznej i kilku innych czynników, aby zobaczyć, czy powinien traktować tę zmienną przy użyciu specyfikatora rejestru, czy nie. A co, jeśli chcemy zoptymalizować nasz kod pod kątem szybkości, wiedząc, że określona zmienna w naszym programie nie jest bardzo ważna i nie chcemy, aby kompilator nawet traktował ją jako rejestr. Mimo to, ustawiając auto, kompilator nie będzie mógł dodać specyfikatora rejestru do zmiennej od wpisania "register auto int a;" LUB "auto register int a;" podnosi błąd używania wielu specyfikatorów klas pamięci. Podsumowując, pomyślałem, że auto może zabronić kompilatorowi traktowania zmiennej jako rejestru poprzez optymalizację. co, jeśli chcemy zoptymalizować nasz kod pod kątem szybkości, wiedząc, że określona zmienna w naszym programie nie jest bardzo ważna i nie chcemy, aby kompilator nawet traktował ją jako rejestr. Mimo to, ustawiając auto, kompilator nie będzie mógł dodać specyfikatora rejestru do zmiennej od wpisania "register auto int a;" LUB "auto register int a;" podnosi błąd używania wielu specyfikatorów klas pamięci. Podsumowując, pomyślałem, że auto może zabronić kompilatorowi traktowania zmiennej jako rejestru poprzez optymalizację. co, jeśli chcemy zoptymalizować nasz kod pod kątem szybkości, wiedząc, że określona zmienna w naszym programie nie jest bardzo ważna i nie chcemy, aby kompilator nawet traktował ją jako rejestr. Mimo to, ustawiając auto, kompilator nie będzie mógł dodać specyfikatora rejestru do zmiennej od wpisania "register auto int a;" LUB "auto register int a;" podnosi błąd używania wielu specyfikatorów klas pamięci. Podsumowując, pomyślałem, że auto może zabronić kompilatorowi traktowania zmiennej jako rejestru poprzez optymalizację. podnosi błąd używania wielu specyfikatorów klas pamięci. Podsumowując, pomyślałem, że auto może zabronić kompilatorowi traktowania zmiennej jako rejestru poprzez optymalizację. podnosi błąd używania wielu specyfikatorów klas pamięci. Podsumowując, pomyślałem, że auto może zabronić kompilatorowi traktowania zmiennej jako rejestru poprzez optymalizację.
Ta teoria nie działa dla kompilatora GCC, jednak nie próbowałem innych kompilatorów.
źródło