Ada argumen umum tentang beberapa inisialisasi variabel dalam satu liner, yaitu:
Pertimbangkan misalnya int i, j = 1; yang mungkin menyebabkan beberapa orang salah percaya kedua variabel sedang diinisialisasi
Kita bisa berargumen bahwa seseorang harus cukup tahu sintaks bahasanya sehingga tidak salah tentang itu. Argumen lain bisa sebagai pengembang kita belajar banyak bahasa kita bisa membuat kesalahan antara kekhususan antar bahasa
Namun untuk kasus yang sangat spesifik saya bertanya-tanya berikut ini apakah itu bahkan ada bahasa di mana sangat sintaks saya, j = 1 menginisialisasi kedua variabel?
Jika bukan argumen itu maka tidak berlaku.
programming-languages
syntax
Walfrat
sumber
sumber
Dim Apple, Orange, Pear as Fruit
adalah deklarasi hukum. Misalkan Anda tidak tahu VB. Apakah kesan pertama AndaApple
adalah tipeFruit
? Bukan itu. Ingat, bahasa sering dibaca oleh orang yang bukan ahli dalam bahasa itu; jika Anda seorang ahli, gunakan bahasa dengan bijak untuk mengomunikasikan niat Anda dengan jelas bahkan kepada non-pakar. Saya tidak pernah menggunakan beberapa inisialisasi dalam bahasa apa pun.var x = 1, y = 1.5;
apakah ini samaint x = 1; double y = 1.5;
atau sama dengandouble x = 1, y = 1.5;
? Ketika kami menambahkanvar
ke C # 3.0 saya melakukan jajak pendapat dan menemukan bahwa sekitar setengah orang percaya bahwa yang pertama "jelas" benar dan setengah lainnya percaya yang lain "jelas" benar, sehingga kami membuatnya ilegal. Fitur yang menyesatkan separuh populasi sepenuhnya adalah fitur yang buruk.Jawaban:
Saya pikir tidak, tapi bukan itu intinya. Intinya adalah itu
i, j = 0
sangat mudah keliru untuki = j = 0
, yang memang menginisialisasi keduanya. Kejelasan adalah persyaratan paling penting pada kode sumber di sebelah kebenaran, dan fakta bahwa pertanyaan ini bahkan muncul membuktikan bahwa kejelasannya tidak optimal.sumber
int i, j=1
versusint i; int j = 1
(atau bahkan lebih baik, baris terpisah)?"Saya pikir, Anda dapat berdebat untuk kedua belah pihak:
Kontra
i, j = 0
:Matematikawan menggunakan ini untuk berarti bahwa keduanya
i
danj
seharusnya nol.Pro
i, j = 0
:Ini masalah sederhana mengetahui prioritas operator Anda. Dan jika Anda ragu tentang prioritas mereka, sekaranglah saatnya untuk mencarinya.
Itu alasan yang sama mengapa kita menulis hal-hal seperti
a.b += c[i]*d[i];
tanpa tanda kurung. Tentu saja ini setara dengan(a.b) += ((c[i])*(d[i]));
, tetapi pemrogram dapat diharapkan untuk mengetahui prioritas operator yang paling sering digunakan, dan dapat melihat prioritas operator ketika mereka tidak yakin. Dengan demikian, tanda kurung umumnya dianggap berantakan tidak berguna kecuali jika mereka memaksakan urutan evaluasi yang berbeda dari yang ditentukan preseden operator.Tentu saja, ada pengecualian. Diutamakan dari
<<
dan+
umumnya dianggap cukup ambigu untuk tanda kurung dalam kedua kasus. Tapi itu pengecualian yang membuktikan aturan itu.Saya, untuk satu, akan jatuh lebih ke sisi Pro, tapi saya siap untuk tetap pada styleguide yang melarang deklarasi semacam itu. Hanya saja bukan masalah yang layak diperebutkan.
sumber
int i, j = 0;
tidak ada operator di dalamnya. Satu-satunya ungkapan dalam pernyataan itu adalah0
dan karena itu prioritas operator tidak masuk ke dalamnya. Parser tidak memperlakukan,
sebagai operator koma atau=
sebagai operator penugasan; alih-alih, ini adalah bagian tata bahasa dari pernyataan deklarasi.but programmers can be expected to know the precedence of the most used operators by heart
, kamu bilang. Dalam contoh yang Anda berikan, saya tidak yakin sebagian besar (rata-rata) programmer menganggap operator akses anggota atau operator indeks array sebagai operator dalam arti matematika sama sekali, tetapi sebaliknya menganggap mereka lebih sebagai nomina bahasa alami dan perkalian operator sebagai kata kerja. Itu sebabnyaint i, j, k = 0;
konstruk jahat seperti itu, karena ia menyajikan analog bahasa alami dari "variabel int i, j, dan k, dideklarasikan dan akan ditetapkan ke 0"!*a[i]
, saya tidak berpikir Anda cukup bisa menguraikannya dengan analogi "kata benda". Adapunint i, j, k = 0;
, itu bisa berarti apa-apa jika Anda tidak mencari aturan: Penafsiran ketiga akan menyatakanint i
, kemudian mengevaluasij
dan akhirnya menetapkank = 0
. Kecuali Anda tahu sintaksis bahasa Anda, Anda tidak dapat menguraikan konstruksi tersebut. Ini masalah Anda jika Anda melakukannya.a[i]
sebagai operator indeks yang diterapkana
, tetapi membaca keduanya secara bersamaan sebagai elemen sintaksis yang tidak dapat direduksi yang menentukan operan dari operator perkalian, dan dengan demikian saya bahkan tidak diminta untuk mengevaluasi diutamakan. (1/2)