Apakah ada perbedaan antara menggunakan untuk (;;) dan sementara (1)?


Jawaban 1:

Dalam hal kode yang dihasilkan, setiap kompiler C modern harus memberi Anda hasil yang sama.

Penulis, profesor, dan orang lain yang mengatakan bahwa untuk (;;) menghasilkan lebih banyak overhead baik (a) tidak tahu apa yang mereka bicarakan, atau (b) bekerja dengan kompiler kuno atau rusak. untuk (;;) tidak menghasilkan overhead tambahan, karena tidak ada kondisi dan tidak ada langkah dari variabel loop. Jika ada, sementara (1) dalam kompiler kuno yang tidak mengoptimalkan sebenarnya dapat menghasilkan lebih banyak overhead, karena dengan blak mengecek apakah 1 adalah nol di bagian atas setiap iterasi. Kompiler modern tidak akan melakukan ini.

Dalam beberapa implementasi kompiler, jika Anda mendongkrak tingkat peringatan cukup tinggi atau menggunakan utilitas seperti serat, Anda mungkin mendapatkan peringatan pada saat (1), atau yang setara, yang mengatakan sesuatu seperti ekspresi kondisional adalah konstan. untuk (;;) tidak menghasilkan peringatan seperti itu, karena tidak ada ekspresi kondisional sama sekali. Saya telah bekerja pada proyek-proyek di mana kami ingin mengkompilasi dengan nol peringatan, dan dengan demikian memilih untuk menggunakan untuk (;;) alih-alih sementara waktu (1) setara. Juga, untuk (;;) dapat lebih mudah untuk mencari daripada varian sementara.

Omong-omong, jika Anda akan menggunakan sementara, itu dianggap lebih mudah dibaca untuk mengatakan:

sementara (benar)

daripada mengatakan:

sementara (1)

meskipun yang pertama membutuhkan lebih banyak mengetik.

Di C modern (mis., Sejak C99 pada 1999), Anda seharusnya tidak membuat versi TRUE Anda sendiri. Alih-alih, sertakan file header stdbool.h, dan Anda akan memiliki akses ke tipe data bool yang ditentukan (daripada harus menggunakan kata kunci _Bool) dan simbolnya benar dan salah. Menggulirkan nilai benar / salah Anda sendiri sangat ...

... 1998.


Jawaban 2:

Standar: Standar C ++

6.5.3 Pernyataan for1 Pernyataan for untuk (untuk-init-statement conditionopt; expressionopt) statementis setara dengan [code] {for-init-statement while (kondisi) {ekspresi pernyataan; }} [/ kode] kecuali bahwa nama-nama yang dideklarasikan dalam for-init-statement berada di wilayah deklaratif yang sama dengan yang dinyatakan dalam kondisi, dan kecuali bahwa pernyataan yang dilanjutkan (tidak terlampir dalam pernyataan iterasi lain) akan mengeksekusi ekspresi sebelum kembali - Mengevaluasi kondisi. [Catatan: Jadi, pernyataan pertama menentukan inisialisasi untuk loop; kondisi (6.4) menentukan tes, dibuat sebelum setiap iterasi, sedemikian sehingga loop keluar ketika kondisi menjadi salah; ekspresi sering menentukan penambahan yang dilakukan setelah setiap iterasi.- catatan akhir] 2 Salah satu atau kedua kondisi dan ekspresi dapat dihilangkan. Kondisi yang hilang membuat klausa tersirat setara dengan while (true).

Mungkin


Jawaban 3:

Setiap kompiler yang bernilai garam akan menghasilkan kode yang identik dalam kedua kasus.

Salah satu preferensi yang mungkin untuk opsi for (;;) adalah bahwa beberapa (banyak?) Orang menganggapnya "gaya buruk" untuk menggunakan konstanta numerik dalam kode. Artinya, Anda tidak menulis

x + = 10;

tetapi Anda menulis

static const int my_constant_value = 10;

(...)

x + = my_constant_value;

Alasannya adalah bahwa memiliki semua konstanta numerik dinyatakan secara eksplisit (dan lebih disukai di awal file sumber, daripada menyebar di seluruh file) menghasilkan kode yang lebih dapat dipertahankan.

Jelas tidak ada perbedaan sehubungan dengan untuk (;;) vs sementara (1), tetapi melihat '1' dalam kode bebas numerik masih tidak nyaman.

Dalam C ++ (dan, sejak C99, juga dalam C) kita dapat menulis "while (true)", tetapi itu bahkan lebih lama dari "while (1)", yang itu sendiri lebih panjang (dengan 1 karakter) daripada "untuk (;;) ".