Di manakah kata kunci otomatis C digunakan?

104

Di masa kuliah saya, saya membaca tentang autokata kunci dan dalam perjalanan waktu saya benar-benar lupa apa itu. Ini didefinisikan sebagai:

mendefinisikan variabel lokal memiliki masa hidup lokal

Saya tidak pernah menemukan itu digunakan di mana pun, apakah itu benar-benar digunakan dan jika demikian lalu di mana itu digunakan dan dalam kasus apa?

Vijay
sumber

Jawaban:

90

autoadalah pengubah seperti static. Ini mendefinisikan kelas penyimpanan variabel. Namun, karena default untuk variabel lokal adalah auto, Anda biasanya tidak perlu menentukannya secara manual.

Halaman ini mencantumkan kelas penyimpanan yang berbeda di C.

Mehrdad Afshari
sumber
13
Baru saja melihat ini lagi setelah seseorang memilih jawaban saya. Anda mengatakan Anda "biasanya tidak perlu menentukannya secara manual". Saya hanya perlu bertanya: apakah sebenarnya ada keadaan yang auto dapat ditentukan tetapi tidak akan terjadi secara default?
Jerry Coffin
2
@JerryCoffin Tidak dalam C. Dalam C ++ 11, ini digunakan kembali dan Anda dapat menggunakannya untuk secara efektif mendapatkan inferensi tipe variabel lokal.
Mehrdad Afshari
2
Satu kemungkinan penggunaan adalah dalam deklarasi maju dari fungsi yang disarangkan di GNU C - meskipun ini adalah pembajakan dari definisi asli auto. tigcc.ticalc.org/doc/keywords.html#auto
josiah
2
Halaman yang ditautkan sudah usang. Sejak C11, ada juga _Thread_localdetailnya: en.cppreference.com/w/c/language/storage_duration dan stackoverflow.com/a/14289720/6557621
MCCCS
132

Jika Anda membaca daftar IAQ (Infrequently Asked Questions), Anda akan tahu bahwa otomotif berguna terutama untuk mendefinisikan atau menyatakan kendaraan:

auto my_car;

Kendaraan yang diparkir secara konsisten di luar ruangan:

extern auto my_car;

Bagi mereka yang kurang memiliki selera humor dan menginginkan "fakta saja Bu": jawaban singkatnya adalah tidak pernah ada alasan untuk menggunakan autosama sekali. Satu-satunya waktu Anda diizinkan untuk menggunakan autoadalah dengan variabel yang sudah memiliki autokelas penyimpanan, jadi Anda hanya menentukan sesuatu yang akan terjadi. Mencoba menggunakan autovariabel apa pun yang tidak memiliki autokelas penyimpanan akan mengakibatkan compiler menolak kode Anda. Saya kira jika Anda ingin mendapatkan teknis, implementasi Anda tidak harus menjadi kompiler (tetapi itu) dan secara teoritis dapat terus mengkompilasi kode setelah mengeluarkan diagnostik (tetapi tidak).

Adendum kecil oleh kaz :

Ada juga:

static auto my_car;

yang memerlukan diagnosa menurut ISO C. Ini benar, karena menyatakan bahwa mobil rusak. Diagnosis ini gratis, tetapi mematikan lampu dasbor akan dikenakan biaya delapan puluh dolar. (Dua puluh atau kurang, jika Anda membeli dongle USB Anda sendiri untuk diagnostik on-board dari eBay).

Hal tersebut di atas extern auto my_carjuga memerlukan diagnostik, dan oleh karena itu tidak pernah dijalankan melalui kompiler, selain oleh staf kota yang ditugaskan untuk melaksanakan parkir.

Jika Anda melihat banyak extern static auto ...di basis kode apa pun, Anda berada di lingkungan yang buruk; segera cari pekerjaan yang lebih baik, sebelum seluruh tempat berubah menjadi Rust.

Jerry Coffin
sumber
@self .: ISO tampaknya tidak mengetahui "ISO 2011". Menurut Anda apa yang mungkin distandarisasi?
Jerry Coffin
6
Untung saya tidak minum kopi, cola, stout, atau cairan berwarna gelap lainnya di mulut saya. Anda akan berutang kepada saya layar komputer, @JerryCoffin, jika itu masalahnya. JAWABAN TERBAIK YANG PERNAH!
David Hammen
2
@Dan: Sejujurnya Anda butuh waktu "cukup lama" untuk membaca 5 baris teks, dan mendapatkan bagian di mana dikatakan: "jawaban singkatnya adalah tidak pernah ada alasan untuk menggunakan auto sama sekali"? Sungguh? Mengingat komentar sebelum komentar Anda, tampaknya setidaknya beberapa orang menganggapnya sebagai kontribusi positif.
Jerry Coffin
@JerryCoffin Saya sudah menjelaskan itu, baca komentar saya lagi. Hindsight adalah 20/20.
Dan Bechard
2
Saya baru saja disahkan kebakaran yang serius (ditutup dua jalur) yang menunjukkan kebutuhan untukchar auto my_car;
gamblang
46

Kata autokunci tidak berguna dalam bahasa C. Itu karena sebelum bahasa C ada bahasa B di mana kata kunci itu diperlukan untuk mendeklarasikan variabel lokal. (B dikembangkan menjadi NB, yang menjadi C).

Berikut adalah panduan referensi untuk B .

Seperti yang Anda lihat, manual ini penuh dengan contoh-contoh yang autodigunakan. Ini karena tidak ada intkata kunci. Beberapa jenis kata kunci diperlukan untuk mengatakan "ini adalah deklarasi variabel", dan kata kunci itu juga menunjukkan apakah itu lokal atau eksternal ( autoversus extrn). Jika Anda tidak menggunakan salah satu atau lainnya, Anda mengalami kesalahan sintaks. Artinya, x, y;bukan deklarasi itu sendiri, tetapi auto x, y;adalah.

Karena basis kode yang ditulis dalam B harus di-porting ke NB dan ke C seiring perkembangan bahasa, versi bahasa yang lebih baru membawa beberapa bagasi untuk meningkatkan kompatibilitas ke belakang yang diterjemahkan ke lebih sedikit pekerjaan. Dalam kasus ini auto, programmer tidak perlu mencari setiap kejadianauto dan menghapusnya.

Jelas dari manual bahwa cruft "implisit int" yang sekarang usang di C (dapat menulis main() { ... }tanpa terlebih dahulu int) juga berasal dari B. Itu adalah fitur kompatibilitas mundur lainnya untuk mendukung kode B. Fungsi tidak memiliki tipe kembalian yang ditentukan di B karena tidak ada tipe. Semuanya adalah kata, seperti di banyak bahasa assembly.

Perhatikan bagaimana sebuah fungsi dapat dideklarasikan extrn putchardan kemudian satu-satunya hal yang membuatnya menjadi fungsi yang digunakan oleh pengenal : ia digunakan dalam ekspresi panggilan fungsi seperti putchar(x), dan itulah yang memberi tahu compiler untuk memperlakukan kata tanpa tipe itu sebagai penunjuk fungsi.

Kaz
sumber
24

Dalam C autoadalah kata kunci yang menunjukkan variabel lokal ke blok. Karena itu adalah default untuk variabel dengan cakupan blok, itu tidak perlu dan sangat jarang digunakan (saya rasa saya tidak pernah melihatnya digunakan di luar contoh dalam teks yang membahas kata kunci). Saya tertarik jika seseorang dapat menunjukkan kasus di mana penggunaan autodiperlukan untuk mendapatkan penguraian atau perilaku yang benar.

Namun, dalam standar C ++ 11 autokata kunci telah 'dibajak' untuk mendukung inferensi tipe, di mana tipe variabel dapat diambil dari tipe penginisialisasinya:

auto someVariable = 1.5;   // someVariable will have type double

Jenis inferensi ditambahkan terutama untuk mendukung deklarasi variabel dalam template atau dikembalikan dari fungsi template di mana jenis yang didasarkan pada parameter template (atau disimpulkan oleh compiler saat template dibuat) sering kali cukup sulit untuk dideklarasikan secara manual.

Michael Burr
sumber
1
"Variabel itu lokal ke blok" - itu sama sekali tidak benar. Semua variabel yang dideklarasikan dalam blok adalah lokal untuk blok itu (sehubungan dengan ruang lingkup). Mereka mungkin ditautkan ke variabel lain dalam program, tetapi deklarasi hanya terlihat di blok itu. autoadalah tentang kelas penyimpanan yang tidak ada hubungannya dengan visibilitas.
fuz
12

Dengan kompilator Aztec C lama, semua variabel otomatis dapat diubah menjadi variabel statis (untuk meningkatkan kecepatan pengalamatan) menggunakan sakelar baris perintah.

Tetapi variabel yang secara eksplisit dideklarasikan dengan autodibiarkan apa adanya dalam kasus itu. (Suatu keharusan untuk fungsi rekursif yang jika tidak tidak akan berfungsi dengan baik!)

raphnet
sumber
7

Kata autokunci ini mirip dengan penyertaan titik koma di Python, itu diperlukan oleh bahasa sebelumnya ( B) tetapi pengembang menyadari itu berlebihan karena kebanyakan halauto .

Saya menduga itu dibiarkan untuk membantu transisi dari B ke C. Singkatnya, satu penggunaan adalah untuk kompatibilitas bahasa B.

Misalnya di B dan 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');
}
Mikhail
sumber
1

Kata kunci otomatis adalah contoh kelas penyimpanan (semacam teknik yang menentukan masa pakai variabel dan tempat penyimpanan). Ini memiliki perilaku di mana variabel yang dibuat oleh Bantuan kata kunci itu memiliki umur (masa hidup) hanya berada dalam tanda kurung kurawal

{
    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
}          
Atul Sharma
sumber
0

autohanya dapat digunakan untuk variabel dengan cakupan blok. extern auto intadalah sampah karena penyusun tidak dapat menentukan apakah ini menggunakan definisi eksternal atau apakah akan menimpa eksternal dengan definisi otomatis (juga otomatis dan eksternal adalah durasi penyimpanan yang sama sekali berbeda, seperti static auto int, yang juga jelas merupakan sampah). Itu selalu dapat memilih untuk menafsirkannya dengan satu cara tetapi sebaliknya memilih untuk memperlakukannya sebagai kesalahan.

Ada satu fitur yang automenyediakan dan mengaktifkan aturan 'everything is an int' di dalam fungsi. Tidak seperti di luar fungsi, di mana a=3diinterpretasikan sebagai definisi int a =3karena tugas tidak ada pada ruang lingkup file, a=3adalah kesalahan di dalam fungsi karena tampaknya kompilator selalu menafsirkannya sebagai tugas ke variabel eksternal daripada definisi (bahkan jika ada ada extern int adeklarasi maju dalam fungsi atau dalam lingkup file), tapi specifier seperti static, const, volatileatau autoakan berarti bahwa itu adalah definisi dan compiler mengambil itu sebagai definisi, kecuali autotidak memiliki efek samping dari penentu lainnya. auto a=3oleh karena itu secara implisit auto int a = 3. Memang,signed a = 3memiliki efek yang sama danunsigned a = 3 selalu merupakan int unsigned.

Juga perhatikan ' autotidak berpengaruh pada apakah suatu objek akan dialokasikan ke register (kecuali beberapa kompiler tertentu memperhatikannya, tetapi tampaknya tidak mungkin)'

Lewis Kelsey
sumber
-1

Saya yakin Anda sudah familiar dengan penentu kelas penyimpanan di C yang "eksternal", "statis", "register" dan "otomatis". Definisi "otomatis" cukup banyak diberikan dalam jawaban lain tetapi di sini adalah kemungkinan penggunaan kata kunci "otomatis" yang saya tidak yakin, tetapi menurut saya ini bergantung pada kompiler. Soalnya, sehubungan dengan penentu kelas penyimpanan, ada aturannya. Kami tidak dapat menggunakan beberapa penentu kelas penyimpanan untuk variabel. Itulah mengapa variabel global statis tidak dapat dikeluarkan. Oleh karena itu, mereka hanya diketahui file mereka. Ketika Anda pergi ke pengaturan compiler Anda, Anda dapat mengaktifkan flag optimasi untuk kecepatan. salah satu cara yang dilakukan compiler adalah, itu mencari variabel tanpa penentu kelas penyimpanan dan kemudian membuat penilaian berdasarkan ketersediaan memori cache dan beberapa faktor lain untuk melihat apakah ia harus memperlakukan variabel itu menggunakan penentu register atau tidak. Sekarang, bagaimana jika kita ingin mengoptimalkan kode kita untuk kecepatan sambil mengetahui bahwa variabel tertentu dalam program kita tidak terlalu penting dan kita bahkan tidak ingin compiler menganggapnya sebagai register. Saya berpikir dengan meletakkan auto, compiler tidak akan bisa menambahkan penentu register ke variabel karena mengetik "register auto int a;" ATAU "auto register int a;" menimbulkan kesalahan dalam menggunakan penentu kelas penyimpanan ganda. Singkatnya, saya pikir auto dapat melarang compiler memperlakukan variabel sebagai register melalui pengoptimalan. bagaimana jika kita ingin mengoptimalkan kode kita untuk kecepatan sementara mengetahui bahwa variabel tertentu dalam program kita tidak terlalu penting dan kita bahkan tidak ingin compiler menganggapnya sebagai register. Saya berpikir dengan meletakkan auto, compiler tidak akan bisa menambahkan penentu register ke variabel karena mengetik "register auto int a;" ATAU "auto register int a;" menimbulkan kesalahan dalam menggunakan penentu kelas penyimpanan ganda. Singkatnya, saya pikir auto dapat melarang compiler memperlakukan variabel sebagai register melalui pengoptimalan. bagaimana jika kita ingin mengoptimalkan kode kita untuk kecepatan sementara mengetahui bahwa variabel tertentu dalam program kita tidak terlalu penting dan kita bahkan tidak ingin compiler menganggapnya sebagai register. Saya berpikir dengan meletakkan auto, compiler tidak akan bisa menambahkan penentu register ke variabel karena mengetik "register auto int a;" ATAU "auto register int a;" menimbulkan kesalahan dalam menggunakan penentu kelas penyimpanan ganda. Singkatnya, saya pikir auto dapat melarang compiler memperlakukan variabel sebagai register melalui pengoptimalan. menimbulkan kesalahan dalam menggunakan penentu kelas penyimpanan ganda. Singkatnya, saya pikir auto dapat melarang compiler memperlakukan variabel sebagai register melalui pengoptimalan. menimbulkan kesalahan dalam menggunakan penentu kelas penyimpanan ganda. Singkatnya, saya pikir auto dapat melarang compiler memperlakukan variabel sebagai register melalui pengoptimalan.

Teori ini tidak berfungsi untuk kompiler GCC namun saya belum mencoba kompiler lain.

Alireza Mirghasemi
sumber