Apakah saya, j = 1 benar-benar menyesatkan? [Tutup]

11

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.

Walfrat
sumber
2
Jika bahasa Anda waras, kebingungan potensial tidak berbahaya karena mengakses variabel yang tidak diinisialisasi memicu kesalahan kompiler.
CodesInChaos
4
@CodesInChaos, apa maksudmu C tidak waras?
Baldrickk
2
Hanya karena bahasa memungkinkan sesuatu tidak berarti Anda tidak menyebabkan rasa sakit yang tidak perlu pada manusia. Satu-satunya tempat kode ini dipanggil adalah selama kuis yang dirancang untuk menghukum mereka yang belum menghafal spesifikasi bahasa. Saya selalu gagal dengan pertanyaan seperti ini. Bleh.
candied_orange
2
Dalam Visual Basic 6 Dim Apple, Orange, Pear as Fruitadalah deklarasi hukum. Misalkan Anda tidak tahu VB. Apakah kesan pertama Anda Appleadalah tipe Fruit? 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.
Eric Lippert
13
Demikian pula: pertimbangkan var x = 1, y = 1.5; apakah ini sama int x = 1; double y = 1.5;atau sama dengan double x = 1, y = 1.5;? Ketika kami menambahkan varke 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.
Eric Lippert

Jawaban:

37

Saya pikir tidak, tapi bukan itu intinya. Intinya adalah itu i, j = 0sangat mudah keliru untuk i = 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.

Kilian Foth
sumber
3
Saya juga berpendapat bahwa jika pernyataan seperti itu tidak menginisialisasi kedua pernyataan, mengapa itu bahkan ada?
Berin Loritsch
2
@BerinLoritsch tergantung pada bahasa. Ini sering dilakukan dalam JavaScript karena pengangkatan deklarasi: ini dianggap praktik terbaik oleh banyak orang untuk mendeklarasikan variabel di bagian atas ruang lingkup di mana mereka tersedia bahkan jika Anda tidak menginisialisasi mereka sampai tempat mereka digunakan dalam kode . Hampir semua alat transformasi kode menghasilkan gaya ini.
Jared Smith
1
Saya kira itu satu hal jika alat kode output melakukan ini, karena itu seharusnya dipercaya. Namun, bagi manusia saya akan merekomendasikan untuk tidak menggabungkan deklarasi dan inisialisasi elemen terakhir hanya pada satu baris. Sepertinya ada bug yang menunggu untuk terjadi.
Berin Loritsch
2
@JaredSmith Selain Maple, saya tidak bisa memikirkan bahasa di mana ini saat ini diinginkan, bahkan C sekarang lebih suka lebih dekat ke ruang lingkup (seperti C ++ dan sebagian besar bahasa lain dengan setengah kompiler statis yang layak) karena memberikan manfaat menghentikan potensi bug dan memungkinkan kompiler untuk memutuskan apa yang harus dilakukan dengan variabel selama fungsi tidak berubah, berpotensi memungkinkan optimasi yang lebih baik mengingat Anda bisa lolos dengan register yang lebih sedikit.
whn
6
Terlepas dari bahasanya, orang harus bertanya, "Apa manfaat dari tulisan int i, j=1versus int i; int j = 1(atau bahkan lebih baik, baris terpisah)?"
chepner
2

Saya pikir, Anda dapat berdebat untuk kedua belah pihak:

  • Kontra i, j = 0:
    Matematikawan menggunakan ini untuk berarti bahwa keduanya idan jseharusnya 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.

cmaster - mengembalikan monica
sumber
7
Saya perhatikan bahwa int i, j = 0;tidak ada operator di dalamnya. Satu-satunya ungkapan dalam pernyataan itu adalah 0dan 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.
Eric Lippert
@EricLippert Sejauh menyangkut aturan diutamakan, perbedaan itu tidak relevan: Bahasa C-style apa pun yang saya tahu menggunakan presedensi yang sama dalam deklarasi seperti pada ekspresi lainnya. Yang lain akan mengundang desaster.
cmaster - mengembalikan monica
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 sebabnya int 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"!
Steve
@Steve Bagaimana Anda mengingat aturan diutamakan sebagai seorang programmer, sepenuhnya terserah Anda. Jika itu membantu Anda untuk menganggap mereka sebagai kata benda bahasa, lakukanlah. Namun, dalam hal ini Anda akan mengalami masalah ketika Anda melihat hal-hal seperti *a[i], saya tidak berpikir Anda cukup bisa menguraikannya dengan analogi "kata benda". Adapun int i, j, k = 0;, itu bisa berarti apa-apa jika Anda tidak mencari aturan: Penafsiran ketiga akan menyatakan int i, kemudian mengevaluasi jdan akhirnya menetapkan k = 0. Kecuali Anda tahu sintaksis bahasa Anda, Anda tidak dapat menguraikan konstruksi tersebut. Ini masalah Anda jika Anda melakukannya.
cmaster - mengembalikan monica
@ cmaster, saya tidak mengungkapkan strategi hafalan khusus saya haha. Saya bukan seorang programmer C jadi keakraban saya dengan operator diutamakan dalam C adalah kelas dua. Tetapi apa yang saya catat ketika saya melihat contoh Anda adalah bahwa saya bahkan tidak menganggap operator perkalian memiliki prioritas relatif terhadap operator indeks array. Yaitu, saya tidak membaca a[i]sebagai operator indeks yang diterapkan a, 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)
Steve