Saya sering melihat dalam kode C dan C ++ konvensi berikut:
some_type val;
val = something;
some_type *ptr = NULL;
ptr = &something_else;
dari pada
some_type val = something;
some_type *ptr = &something_else;
Awalnya saya berasumsi bahwa ini adalah kebiasaan yang tersisa dari hari-hari ketika Anda harus mendeklarasikan semua variabel lokal di bagian atas ruang lingkup. Tapi saya sudah belajar untuk tidak begitu cepat mengabaikan kebiasaan pengembang veteran. Jadi, apakah ada alasan bagus untuk menyatakan dalam satu baris, dan menetapkan setelahnya?
Jawaban:
C
Dalam C89 semua deklarasi harus berada di awal lingkup (
{ ... }
), tetapi persyaratan ini dibatalkan dengan cepat (pertama dengan ekstensi kompiler dan kemudian dengan standar).C ++
Contoh-contoh ini tidak sama.
some_type val = something;
memanggil copy constructor saatval = something;
memanggil constructor default dan kemudianoperator=
fungsinya Perbedaan ini sering kritis.Kebiasaan
Beberapa orang lebih suka mendeklarasikan variabel terlebih dahulu dan kemudian mendefinisikannya, dalam kasus mereka memformat ulang kode mereka nanti dengan deklarasi di satu tempat dan definisi di tempat lain.
Tentang pointer, beberapa orang memiliki kebiasaan untuk menginisialisasi setiap pointer ke
NULL
ataunullptr
, tidak peduli apa yang mereka lakukan dengan pointer itu.sumber
some_type
konstruktor mengambilsomething
sebagai argumen tunggal. Ini adalah kasus tepi yang sangat menarik dan tidak biasa di C ++ ... itu berarti ada anggapan tentang makna semantik dari operasi ini.Anda telah menandai pertanyaan C dan C ++ secara bersamaan, sementara jawabannya sangat berbeda dalam bahasa-bahasa ini.
Pertama, kata-kata dari judul pertanyaan Anda salah (atau, lebih tepatnya, tidak relevan dengan pertanyaan itu sendiri). Dalam kedua contoh Anda, variabel dideklarasikan dan didefinisikan secara bersamaan, dalam satu baris. Perbedaan antara contoh Anda adalah bahwa pada variabel pertama dibiarkan tidak diinisialisasi atau diinisialisasi dengan nilai dummy dan kemudian diberi nilai yang bermakna kemudian. Dalam contoh kedua variabel diinisialisasi segera.
Kedua, dalam bahasa C ++, seperti yang dicatat oleh @nightcracker dalam jawabannya, kedua konstruk ini secara semantik berbeda. Yang pertama bergantung pada inisialisasi sedangkan yang kedua - pada tugas. Dalam C ++ operasi ini kelebihan beban dan karena itu berpotensi menyebabkan hasil yang berbeda (walaupun orang dapat mencatat bahwa memproduksi inisialisasi dan penugasan yang tidak setara bukanlah ide yang baik).
Dalam bahasa C standar asli (C89 / 90) adalah ilegal untuk mendeklarasikan variabel di tengah blok, itulah sebabnya Anda mungkin melihat variabel dinyatakan tidak diinisialisasi (atau diinisialisasi dengan nilai dummy) di awal blok dan kemudian ditugaskan bermakna nilai nanti, ketika nilai-nilai bermakna itu tersedia.
Dalam bahasa C99 tidak apa-apa untuk mendeklarasikan variabel di tengah-tengah blok (seperti dalam C ++), yang berarti bahwa pendekatan pertama hanya diperlukan dalam beberapa situasi tertentu ketika penginisialisasi tidak diketahui pada titik deklarasi. (Ini juga berlaku untuk C ++).
sumber
some_type val;
segera menyatakan dan mendefinisikan variabelval
. Inilah yang saya maksud dalam jawaban saya.Saya pikir itu kebiasaan lama, sisa dari "deklarasi lokal" kali. Dan karena itu sebagai jawaban atas pertanyaan Anda: Tidak, saya pikir tidak ada alasan yang bagus. Saya tidak pernah melakukannya sendiri.
sumber
Aku mengatakan sesuatu tentang itu dalam jawaban saya untuk pertanyaan oleh Helium3 .
Pada dasarnya, saya katakan itu adalah alat bantu visual untuk dengan mudah melihat apa yang diubah.
dan
sumber
Jawaban lainnya cukup bagus. Ada beberapa sejarah di sekitar ini dalam C. Dalam C ++ ada perbedaan antara konstruktor dan operator penugasan.
Saya terkejut tidak ada yang menyebutkan poin tambahan: menjaga deklarasi terpisah dari penggunaan variabel kadang-kadang bisa jauh lebih mudah dibaca.
Berbicara secara visual, ketika membaca kode, artefak yang lebih biasa, seperti jenis dan nama variabel, bukan yang melompat pada Anda. Ini adalah pernyataan yang biasanya paling Anda minati, menghabiskan sebagian besar waktu menatap, dan ada kecenderungan untuk melirik sisanya.
Jika saya memiliki beberapa jenis, nama, dan penugasan semua terjadi di ruang sempit yang sama, itu sedikit kelebihan informasi. Lebih jauh, itu berarti bahwa sesuatu yang penting sedang terjadi di ruang yang biasanya saya tinjau.
Mungkin agak kontra-intuitif untuk mengatakan, tetapi ini adalah satu contoh di mana membuat sumber Anda mengambil lebih banyak ruang vertikal dapat membuatnya lebih baik. Saya melihat ini sebagai alasan mengapa Anda tidak harus menulis baris penuh sesak yang melakukan jumlah aritmatika dan tugas penunjuk yang gila di ruang vertikal yang ketat - hanya karena bahasa tersebut memungkinkan Anda lolos dengan hal-hal seperti itu tidak berarti Anda harus melakukan sepanjang waktu. :-)
sumber
Dalam C, ini adalah praktik standar karena variabel harus dideklarasikan pada awal fungsi, tidak seperti di C ++, di mana ia dapat dideklarasikan di mana saja di badan fungsi yang akan digunakan setelahnya. Pointer diatur ke 0 atau NULL, karena itu hanya memastikan bahwa pointer menunjuk ke sampah. Kalau tidak, tidak ada keuntungan signifikan yang bisa saya pikirkan, yang memaksa siapa pun untuk melakukan hal itu.
sumber
Pro untuk definisi variabel lokalisasi dan inisialisasi bermakna mereka:
jika variabel biasanya diberi nilai yang berarti ketika mereka pertama kali muncul dalam kode (perspektif lain tentang hal yang sama: Anda menunda penampilan mereka sampai nilai yang bermakna tersedia) maka tidak ada kemungkinan mereka secara tidak sengaja digunakan dengan nilai yang tidak berarti atau tidak diinisialisasi ( yang dapat dengan mudah terjadi adalah beberapa inisialisasi sengaja dilewati karena pernyataan kondisional, evaluasi hubung singkat, pengecualian dll.)
bisa lebih efisien
operator=
terkadang bisa kurang efisien dan memerlukan objek sementarameminimalkan ruang lingkup variabel pada gilirannya meminimalkan jumlah rata-rata variabel secara bersamaan dalam lingkup : ini
kadang-kadang lebih ringkas karena Anda tidak mengulangi nama variabel dalam definisi kemudian dalam tugas awal yang bermakna
diperlukan untuk jenis-jenis tertentu seperti referensi dan ketika Anda ingin objek menjadi
const
Argumen untuk pengelompokan definisi variabel:
kadang-kadang lebih mudah dan / atau singkat untuk memperhitungkan tipe dari sejumlah variabel:
the_same_type v1, v2, v3;
(jika alasannya hanya karena nama jenisnya terlalu panjang atau rumit,
typedef
terkadang bisa lebih baik)terkadang diinginkan untuk mengelompokkan variabel secara independen dari penggunaannya untuk menekankan sekumpulan variabel (dan tipe) yang terlibat dalam beberapa operasi:
type v1;
type v2;
type v3;
Ini menekankan kesamaan tipe dan membuatnya sedikit lebih mudah untuk mengubahnya, sambil tetap berpegang pada variabel per baris yang memfasilitasi copy-paste,
//
komentar dll.Seperti yang sering terjadi dalam pemrograman, sementara ada manfaat empiris yang jelas untuk satu praktik dalam kebanyakan situasi, praktik lain benar-benar dapat jauh lebih baik dalam beberapa kasus.
sumber