Bahasa seperti C, Java, dan C ++ semua memerlukan tanda kurung di sekitar seluruh ekspresi bila digunakan dalam if
, while
atau switch
.
if (true) {
// Do something
}
sebagai lawan
if true {
// Do something
}
Ini aneh bagi saya karena tanda kurung berlebihan. Dalam contoh ini, true
adalah satu ekspresi sendiri. Tanda kurung tidak mengubah artinya dengan cara apa pun yang saya tahu. Mengapa sintaks aneh ini ada dan mengapa begitu umum? Apakah ada manfaatnya yang tidak saya sadari?
THEN
).if
pernyataan, mereka hanya membuat pernyataan majemuk.Jawaban:
Perlu ada beberapa cara untuk mengatakan di mana kondisi berakhir dan cabang dimulai. Ada banyak cara untuk melakukan itu.
Dalam beberapa bahasa, tidak ada persyaratan sama sekali , misalnya dalam Smalltalk, Self, Newspeak, Io, Ioke, Seph, dan Fancy. Percabangan bersyarat hanya diimplementasikan sebagai metode normal seperti metode lainnya. Metode ini diimplementasikan pada objek booleans dan dipanggil pada boolean. Dengan begitu, kondisinya hanyalah penerima metode, dan dua cabang adalah dua argumen, misalnya dalam Smalltalk:
Jika Anda lebih terbiasa dengan Java, ini setara dengan yang berikut:
Dalam rumpun bahasa Lisp, situasinya serupa: kondisional hanya fungsi normal (sebenarnya, makro) dan argumen pertama adalah kondisinya, argumen kedua dan ketiga adalah cabang, sehingga mereka hanya argumen fungsi normal, dan ada tidak ada yang khusus diperlukan untuk membatasi mereka:
Beberapa bahasa menggunakan kata kunci sebagai pembatas, misalnya Algol, Ada, BASIC, Pascal, Modula-2, Oberon, Oberon-2, Oberon Aktif, Pascal Komponen, Zonnon, Modula-3:
Di Ruby, Anda dapat menggunakan kata kunci atau pemisah ekspresi (titik koma atau baris baru):
Go mengharuskan cabang menjadi blok dan tidak mengizinkan ekspresi atau pernyataan, yang membuat kurung kurawal wajib. Karena itu, tanda kurung tidak diperlukan, meskipun Anda dapat menambahkannya jika Anda mau; Perl6 dan Rust serupa dalam hal ini:
Beberapa bahasa menggunakan karakter non-alfanumerik lainnya untuk membatasi kondisi, misalnya Python:
Intinya adalah: Anda perlu beberapa cara untuk memberitahu dimana kondisi berakhir dan cabang dimulai. Ada banyak cara untuk melakukannya, tanda kurung hanyalah salah satunya.
sumber
Tanda kurung hanya tidak perlu jika Anda menggunakan kawat gigi.
Misalnya menjadi ambigu tanpa mereka.
sumber
if
dalam: dasar, perakitan, python, bash / zsh, tcl, batch, brainfuck, atau kode mesin. Kurangnya tanda kurung hanya membuatif
ambigu jika bahasa telah dirancang untuk bergantung pada mereka.if Condition then ...
.{}
wajib dan oleh karena itu tidak memerlukan parens di sekitar ekspresi. Tidak hanya parens tidak diperlukan, tetapi jika saya ingat dengan benar menambahkan parens akan menyebabkan kesalahan kompilasi - mereka dilarangTanda kurung dalam
if
pernyataan tidak memiliki arti yang sama dengan tanda kurung yang digunakan dalam ekspresi aritmatika. Tanda kurung dalam ekspresi aritmatika digunakan untuk mengelompokkan ekspresi bersama. Tanda kurung dalamif
pernyataan digunakan untuk membatasi ekspresi boolean; yaitu, untuk membedakan ekspresi boolean dari sisaif
pernyataan.Dalam sebuah
if
pernyataan, tanda kurung tidak melakukan fungsi pengelompokan (meskipun, dalamif
pernyataan itu, Anda masih bisa menggunakan tanda kurung untuk ekspresi aritmatika grup. Set kurung terluar kemudian berfungsi untuk membatasi seluruh ekspresi boolean). Membuatnya diperlukan menyederhanakan kompiler, karena kompiler dapat mengandalkan tanda kurung yang selalu ada.sumber
IF primary_expression statement
. Perhatikan bahwa yang terakhir sama-sama tidak ambigu.primary_expression
tidak dapat dibedakan dari operator awalan pada pernyataan-pernyataan. Untuk menyalin jawaban Telastyn ini,if true ++ x;
. Juga, jika pernyataan kosong ada,if a & f;
bisa berupa pernyataan kosong dan biner&
di dalam kondisi, atau unary&
pada awal pernyataan. Tetapi ketika mencocokkan tanda kurung, tepat ada satu pertandingan untuk pembukaan (IDENTIFIER
,CONSTANT
,STRING_LITERAL
dan'(' expression ')'
.Seperti yang telah ditunjukkan sebagian lainnya, hal ini disebabkan oleh fakta bahwa ekspresi juga merupakan pernyataan yang valid, dan dalam kasus blok dengan hanya satu pernyataan, Anda dapat melepaskan kawat gigi. Ini berarti bahwa yang berikut ini ambigu:
Karena itu bisa diartikan sebagai:
dari pada:
Sejumlah bahasa (misalnya Python) memungkinkan Anda menghindari tanda kurung tetapi masih memiliki penanda kondisi akhir:
Namun Anda benar bahwa kami dapat mendefinisikan bahasa tempat tanda kurung tidak pernah diperlukan: bahasa di mana ekspresi bukan pernyataan yang valid tidak akan memiliki masalah ini.
Sayangnya ini berarti bahwa hal-hal seperti:
tidak akan menjadi pernyataan yang valid, jadi Anda harus memperkenalkan beberapa sintaks aneh untuk dapat melakukan tindakan seperti itu tanpa membuat ekspresi. Cara sederhana untuk melakukan ini adalah dengan hanya menambahkan ekspresi dengan marker seperti
[statement]
:Sekarang ambiguitas menghilang karena Anda harus menulis:
Tapi seperti yang Anda lihat, saya tidak melihat bahasa seperti itu tersebar luas karena menempatkan tanda kurung di sekitar
if
-condition (atau:
pada akhirnya) jauh lebih baik daripada meletakkan penanda seperti itu untuk setiap pernyataan ekspresi.Catatan : penggunaan
[statement]
marker hanyalah sintaks yang paling sederhana yang dapat saya pikirkan. Namun Anda dapat memiliki dua sintaks yang sangat berbeda untuk ekspresi dan pernyataan tanpa ambiguitas di antara mereka yang tidak memerlukan penanda seperti itu. Masalahnya adalah: bahasanya akan sangat aneh karena untuk melakukan hal yang sama dalam ekspresi atau pernyataan Anda harus menggunakan sintaks yang sama sekali berbeda.Satu hal yang terlintas dalam pikiran untuk memiliki dua sintaks yang terpisah tanpa penanda eksplisit seperti itu adalah, misalnya: memaksa pernyataan untuk menggunakan simbol unicode (jadi alih-alih
for
Anda akan menggunakan beberapa variasi unicode dari huruf-huruff
,o
danr
), sementara ekspresi menjadi Hanya ASCII.sumber
discard
nilainya dalam Nim . Namun, itu hanya dilakukan untuk keamanan tipe, bukan karena alasan sintaksis.?
simbol sebenarnya adalah fungsi setelah PP). Tidak ada;
. Tentu, ini membutuhkan penanda untuk garis lanjutan, tetapi ini tidak disarankan. harbour.github.io/doc/clc53.html#if-cmd . Kompiler cepat dan sederhana (dibuat dengan Bison / Flex).if
,while
ecc terbatas dibandingkan dengan ekspresi umum yang digunakan dalam bahasa lain. Tentu: jika Anda memiliki lebih dari dua kategori sintaksis (seperti pernyataan, ekspresi, ekspresi logis, ekspresi pembuat kopi, ...) Anda dapat memperdagangkan beberapa kebebasan.Adalah umum untuk bahasa C-family membutuhkan tanda kurung ini, tetapi tidak universal.
Salah satu perubahan sintaksis Perl 6 yang lebih mencolok adalah bahwa mereka memodifikasi tata bahasa sehingga Anda tidak harus memberikan tanda kurung di sekitarnya
if
,for
dan kondisi pernyataan yang serupa. Jadi sesuatu seperti ini sangat valid di Perl 6:dengan adanya
Namun, karena mereka hanya ekspresi, Anda dapat menempatkan tanda kurung di sekelilingnya jika Anda mau, dalam hal ini mereka hanya pengelompokan biasa daripada bagian yang diperlukan dari sintaks seperti di C, C #, Java dll.
Rust memiliki sintaksis yang mirip dengan Perl 6 di departemen ini:
Menurut saya, fitur bahasa C-terinspirasi yang lebih modern adalah melihat hal-hal seperti ini dan bertanya-tanya tentang cara menghapusnya.
sumber
if
atau loop dengan BLOCK, parens diperlukan, misalnya dalamif ( $x == 4 ) { ... }
atauforeach my $foo ( @bar ) { ... }
. Ketika notasi postfix digunakan parens adalah opsional, seperti dalamreturn unless $foo;
atau++$x while s/foo/bar/g;
.Ada satu aspek yang saya kaget karena tidak ada jawaban yang ada.
C, dan banyak turunan C dan mirip, memiliki kekhasan bahwa nilai penugasan adalah nilai yang diberikan. Konsekuensi dari ini adalah bahwa penugasan dapat digunakan di mana nilai diharapkan.
Ini memungkinkan Anda untuk menulis hal-hal seperti
atau
atau
(yang secara implisit diperlakukan sebagai
while (n < m && *p1++ = *p2++ != 0) { n++; }
karena C memperlakukan non-nol sebagai benar; kebetulan, saya pikir itu hanya tentang strncpy () di pustaka standar C)atau bahkan
dan itu semua valid. Tidak semua kombinasi yang valid secara sintaksis selalu berguna (dan kompiler modern secara khusus memperingatkan tentang penugasan di dalam kondisional, karena ini adalah kesalahan umum), tetapi beberapa darinya sebenarnya berguna.
Mengurai pernyataan seperti itu kemungkinan akan jauh lebih sulit jika tidak ada cara pasti untuk menentukan di mana ekspresi bersyarat dimulai dan berakhir.
Parenthesis sudah digunakan untuk membatasi nama fungsi dari argumen fungsi, jadi saya kira mereka sepertinya pilihan alami juga untuk membatasi kata kunci dari argumen kata kunci.
Tentu, sintaksis alternatif dapat didefinisikan untuk melakukan hal yang sama. Tetapi melakukan hal itu akan menambah kompleksitas, terutama dalam parser yang kemudian perlu berurusan dengan dua set sintaks yang berbeda untuk sebagian besar hal yang sama. Kembali ketika C sedang dirancang, daya komputasi (baik dalam hal kemampuan angka-angka, memori yang bekerja, dan kapasitas penyimpanan) sangat terbatas; segala sesuatu yang mengurangi kompleksitas dengan sedikit atau tanpa biaya untuk keterbacaan hampir pasti merupakan perubahan yang disambut baik.
Menggunakan tanda kurung mungkin tampak sedikit kuno hari ini, tetapi tidak seperti yang diberikan seseorang dengan keakraban dengan bahasa, itu merusak keterbacaan dibandingkan dengan beberapa sintaks lain yang mampu mengekspresikan hal yang sama.
sumber
Alasannya sebagian besar sejarah.
Pada saat kompiler C pertama ditulis, komputer memiliki ram, cpu dan kompiler yang sangat terbatas di mana ditulis “dengan tangan” dengan beberapa alat untuk membantu penulis kompiler. Oleh karena itu aturan yang rumit mahal untuk diimplementasikan dalam kompiler. C ++, C #, Java, dll semuanya dirancang agar mudah dipelajari oleh programmer C, oleh karena itu tidak ada perubahan "tidak perlu" yang dibuat.
Dalam conditional bahasa 'c like' (
if, while, etc
) tidak memerlukanblock
kode mati eksplisit , Anda bisa menggunakan pernyataan sederhana.atau Anda bisa menggabungkan pernyataan bersama menjadi
compound statement
dengan memasukkannya{}
Kami menyukai kompiler untuk menemukan kesalahan yang kami buat dan berikan sebagai pesan kesalahan yang bisa kami pahami.
sumber
Java dan C ++ dikembangkan setelah C menjadi bahasa pemrograman yang sangat populer. Salah satu pertimbangan dalam desain masing-masing bahasa adalah bahwa itu akan menarik bagi programmer C dan merayu programmer tersebut untuk menggunakan bahasa baru. (Saya adalah salah satu dari programmer C yang berhasil dirayu). C ++ juga dirancang untuk (hampir) dipertukarkan dengan kode C. Dalam rangka mendukung tujuan tersebut, baik C ++ dan Java mengadopsi banyak sintaks C, termasuk kurung di sekitar kondisi
if
,while
danswitch
pernyataan.Oleh karena itu alasan mengapa semua bahasa ini membutuhkan tanda kurung di sekitar kondisi pernyataan tersebut adalah karena C melakukannya, dan pertanyaannya adalah mengapa C membutuhkan tanda kurung tersebut.
Asal-usul bahasa C dijelaskan dalam artikel ini dengan Dennis Ritchie, salah satu penulis utama perkembangannya (beberapa bahkan mungkin mengatakan yang penulis utama perkembangannya). Sebagaimana diceritakan dalam artikel itu, C pada awalnya dikembangkan pada awal 1970-an sebagai bahasa pemrograman sistem untuk komputer dengan ruang yang sangat terbatas dalam memori utama. Itu diinginkan untuk memiliki bahasa yang tingkat lebih tinggi dari bahasa assembly, tetapi mengingat sumber daya yang tersedia untuk bekerja dengan, kemudahan penguraian bahasa juga penting. Membutuhkan tanda kurung akan membuatnya relatif mudah untuk mengidentifikasi kode kondisional.
Orang juga dapat menyimpulkan bahwa kemampuan untuk menulis program menggunakan lebih sedikit karakter dianggap sebagai keuntungan, dan dua tanda kurung mengambil lebih sedikit ruang daripada kata kunci
THEN
yang digunakan dalam FORTRAN dan bahasa tingkat tinggi lainnya pada waktu itu; sebenarnya, karena tanda kurung juga bisa menggantikan spasi sebagai pembatas simbol,if(a==b)
empat karakter keseluruhan lebih pendek dariIF a==b THEN
.Bagaimanapun, beberapa keseimbangan harus dibuat antara betapa mudahnya manusia dapat membaca, menulis, dan memahami program yang ditulis dalam C, betapa mudahnya seorang kompiler dapat menguraikan dan menyusun program yang ditulis dalam C, dan berapa kilobyte (!) akan diperlukan baik untuk sumber program dan kompilator itu sendiri. Dan tanda kurung di sekitar kondisi
if
,while
danswitch
pernyataan adalah bagaimana orang memilih untuk menyerang keseimbangan dalam desain C.Sebagaimana dibuktikan dalam beberapa jawaban lain, setelah Anda menghilangkan keadaan tertentu di mana C dikembangkan, semua jenis bentuk sintaksis alternatif telah digunakan untuk persyaratan berbagai bahasa pemrograman. Jadi kurung benar-benar hanya sampai pada keputusan desain yang dibuat oleh beberapa orang di bawah batasan tertentu pada waktu tertentu dalam sejarah.
sumber
Banyak orang di sini beralasan bahwa tanpa tanda kurung sintaksinya akan ambigu dan secara diam-diam menyiratkan bahwa ini entah bagaimana akan menjadi buruk atau bahkan situasi yang mustahil.
Faktanya, bahasa memiliki banyak cara untuk menghadapi ambiguitas. Prioritas operator hanyalah salah satu contoh dari topik ini.
Tidak, ambiguitas bukan alasan untuk tanda kurung. Saya kira kita bisa membuat versi C yang tidak memerlukan tanda kurung di sekitar kondisi (sehingga menjadikannya opsional) dan yang masih membuat kode yang valid dalam semua kasus. Contoh dari
if a ++ b;
dapat diartikan sebagai setara denganif (a) ++b;
atauif (a++) b;
, apa pun yang tampaknya lebih sesuai.Pertanyaan mengapa Dennis Ritchie memilih untuk membuat () wajib (dan dengan demikian menciptakan meme ini untuk banyak bahasa turunan) agak agak linguistik. Saya kira gagasan menyatakan dengan jelas bahwa kondisi adalah ekspresi daripada perintah adalah bapak pemikiran.
Dan pada kenyataannya, C dirancang menjadi parseable menggunakan parser sekali jalan. Menggunakan sintaks dengan tanda kurung wajib di sekitar kondisi mendukung aspek ini.
sumber
Tanda kurung di sekitar
if
kondisi tidak diperlukan dalam Fortran, Cobol, PL / 1, Algol, Algo-68, Pascal, Modula, XPL, PL / M, MPL, ... atau bahasa lain apa pun yang memilikithen
kata kunci.then
berfungsi untuk membatasicondition
dari berikut inistatement
.Tanda kurung penutup dalam C dll berfungsi sebagai
then
, dan yang pembuka secara resmi berlebihan.Keterangan di atas berlaku untuk bahasa yang diurai secara tradisional.
sumber