Di masa kuliah saya, saya membaca tentang auto
kata 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?
auto
dapat ditentukan tetapi tidak akan terjadi secara default?auto
. tigcc.ticalc.org/doc/keywords.html#auto_Thread_local
detailnya: en.cppreference.com/w/c/language/storage_duration dan stackoverflow.com/a/14289720/6557621Jika Anda membaca daftar IAQ (Infrequently Asked Questions), Anda akan tahu bahwa otomotif berguna terutama untuk mendefinisikan atau menyatakan kendaraan:
Kendaraan yang diparkir secara konsisten di luar ruangan:
Bagi mereka yang kurang memiliki selera humor dan menginginkan "fakta saja Bu": jawaban singkatnya adalah tidak pernah ada alasan untuk menggunakan
auto
sama sekali. Satu-satunya waktu Anda diizinkan untuk menggunakanauto
adalah dengan variabel yang sudah memilikiauto
kelas penyimpanan, jadi Anda hanya menentukan sesuatu yang akan terjadi. Mencoba menggunakanauto
variabel apa pun yang tidak memilikiauto
kelas 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:
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_car
juga 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.sumber
char auto my_car;
Kata
auto
kunci 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
auto
digunakan. Ini karena tidak adaint
kata kunci. Beberapa jenis kata kunci diperlukan untuk mengatakan "ini adalah deklarasi variabel", dan kata kunci itu juga menunjukkan apakah itu lokal atau eksternal (auto
versusextrn
). Jika Anda tidak menggunakan salah satu atau lainnya, Anda mengalami kesalahan sintaks. Artinya,x, y;
bukan deklarasi itu sendiri, tetapiauto 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 dahuluint
) 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 putchar
dan kemudian satu-satunya hal yang membuatnya menjadi fungsi yang digunakan oleh pengenal : ia digunakan dalam ekspresi panggilan fungsi sepertiputchar(x)
, dan itulah yang memberi tahu compiler untuk memperlakukan kata tanpa tipe itu sebagai penunjuk fungsi.sumber
Dalam C
auto
adalah 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 penggunaanauto
diperlukan untuk mendapatkan penguraian atau perilaku yang benar.Namun, dalam standar C ++ 11
auto
kata kunci telah 'dibajak' untuk mendukung inferensi tipe, di mana tipe variabel dapat diambil dari tipe penginisialisasinya: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.
sumber
auto
adalah tentang kelas penyimpanan yang tidak ada hubungannya dengan visibilitas.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
auto
dibiarkan apa adanya dalam kasus itu. (Suatu keharusan untuk fungsi rekursif yang jika tidak tidak akan berfungsi dengan baik!)sumber
Kata
auto
kunci 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:
sumber
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
sumber
auto
hanya dapat digunakan untuk variabel dengan cakupan blok.extern auto int
adalah 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, sepertistatic 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
auto
menyediakan dan mengaktifkan aturan 'everything is an int' di dalam fungsi. Tidak seperti di luar fungsi, di manaa=3
diinterpretasikan sebagai definisiint a =3
karena tugas tidak ada pada ruang lingkup file,a=3
adalah kesalahan di dalam fungsi karena tampaknya kompilator selalu menafsirkannya sebagai tugas ke variabel eksternal daripada definisi (bahkan jika ada adaextern int a
deklarasi maju dalam fungsi atau dalam lingkup file), tapi specifier sepertistatic
,const
,volatile
atauauto
akan berarti bahwa itu adalah definisi dan compiler mengambil itu sebagai definisi, kecualiauto
tidak memiliki efek samping dari penentu lainnya.auto a=3
oleh karena itu secara implisitauto int a = 3
. Memang,signed a = 3
memiliki efek yang sama danunsigned a = 3
selalu merupakan int unsigned.Juga perhatikan '
auto
tidak berpengaruh pada apakah suatu objek akan dialokasikan ke register (kecuali beberapa kompiler tertentu memperhatikannya, tetapi tampaknya tidak mungkin)'sumber
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.
sumber