Mengapa bahasa memerlukan tanda kurung di sekitar ekspresi ketika digunakan dengan "jika" dan "sementara"?

67

Bahasa seperti C, Java, dan C ++ semua memerlukan tanda kurung di sekitar seluruh ekspresi bila digunakan dalam if, whileatau switch.

if (true) {
    // Do something
}

sebagai lawan

if true {
    // Do something
}

Ini aneh bagi saya karena tanda kurung berlebihan. Dalam contoh ini, trueadalah 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?

Velovix
sumber
20
Pascal tidak memerlukan tanda kurung (karena membutuhkan a THEN).
JimmyB
30
Python, Ruby tidak.
smci
31
Saya percaya C menggunakan tanda kurung karena kawat gigi adalah opsional untuk badan pernyataan tunggal. Atau mungkin cara yang lebih baik untuk mengatakannya adalah bahwa kawat gigi bukan bagian dari ifpernyataan, mereka hanya membuat pernyataan majemuk.
Fred Larson
7
Menariknya, membutuhkan kawat gigi tetapi bukan tanda kurung.
Kos
25
Pertanyaannya sedikit tautologis. Mengapa manhole bundar mencakup semua? Mengapa semua saudara laki-laki? Mengapa semua bahasa yang membutuhkan paren membutuhkan paren? Penutup lubang bundar bulat menurut definisi; saudara laki-laki menurut definisi; bahasa yang memerlukan paren membutuhkan paren menurut definisi.
Eric Lippert

Jawaban:

155

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:

aBooleanExpression ifTrue: [23] ifFalse: [42].

Jika Anda lebih terbiasa dengan Java, ini setara dengan yang berikut:

aBooleanExpression.ifThenElse(() -> 23, () -> 42);

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:

(if aBooleanExpression 23 42)

Beberapa bahasa menggunakan kata kunci sebagai pembatas, misalnya Algol, Ada, BASIC, Pascal, Modula-2, Oberon, Oberon-2, Oberon Aktif, Pascal Komponen, Zonnon, Modula-3:

IF aBooleanExpression THEN RETURN 23 ELSE RETURN 42;

Di Ruby, Anda dapat menggunakan kata kunci atau pemisah ekspresi (titik koma atau baris baru):

if a_boolean_expression then 23 else 42 end

if a_boolean_expression; 23 else 42 end

# non-idiomatic, the minimum amount of whitespace required syntactically
if a_boolean_expression
23 else 42 end

# idiomatic, although only the first newline is required syntactically
if a_boolean_expression
  23
else
  42
end

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:

if aBooleanExpression { return 23 } else { return 42 }

Beberapa bahasa menggunakan karakter non-alfanumerik lainnya untuk membatasi kondisi, misalnya Python:

if aBooleanExpression: return 23
else: return 42

Intinya adalah: Anda perlu beberapa cara untuk memberitahu dimana kondisi berakhir dan cabang dimulai. Ada banyak cara untuk melakukannya, tanda kurung hanyalah salah satunya.

Jörg W Mittag
sumber
8
Gambaran yang sangat bagus.
Peter - Reinstate Monica
2
tentu saja dalam bahasa di mana ekspresi kosong bukan pernyataan (misalnya sesuatu seperti BASIC yang lebih lama di mana nilai yang dihitung harus ditetapkan ke variabel atau diteruskan ke beberapa pernyataan lain) atau di mana tidak ada operator awalan Anda harus selalu dapat untuk mengidentifikasi akhir dari suatu ekspresi dan memulai dari suatu pernyataan. Saya pasti bisa melihat varian BASIC yang mengelola tanpa pembatas di akhir pernyataan IF.
Periata Breatta
4
Juga, karena C dirancang pada tahun 70-an, dan perhitungannya mahal, menambahkan tanda kurung kecil mungkin akan membuat parser sedikit lebih mudah untuk ditulis.
Machado
4
Re: Lisp: "sebenarnya, makro". Dalam praktiknya IF adalah bentuk khusus dalam Skema dan CL (hanya untuk kelengkapan).
coredump
1
@Leushenko: Dan, misalnya dalam MISC, yang malas-secara-default, semua bentuk kondisional hanya fungsi normal, baik makro maupun bentuk khusus. (Memang, AFAIR, MISC memiliki nol bentuk khusus?)
Jörg W Mittag
70

Tanda kurung hanya tidak perlu jika Anda menggunakan kawat gigi.

if true ++ x;

Misalnya menjadi ambigu tanpa mereka.

Telastyn
sumber
28
@RobertHarvey - kurung The yang dibutuhkan oleh hampir semua bahasa aku sadar. Tentu saja C dan kerabatnya. OP yang bertanya mengapa mereka yang diperlukan - dan itu karena bahasa akan menjadi ambigu sebaliknya.
Telastyn
25
Tepat di atas kepala saya, tanda kurung tidak diperlukan ifdalam: dasar, perakitan, python, bash / zsh, tcl, batch, brainfuck, atau kode mesin. Kurangnya tanda kurung hanya membuat ifambigu jika bahasa telah dirancang untuk bergantung pada mereka.
candied_orange
12
Saya heran bahwa tidak ada yang menyebutkan versi yang paling logis dan mudah dibaca - dalam Pascal (termasuk. Delphi) itu if Condition then ....
Ulrich Gerhardt
18
Go adalah contoh yang baik untuk melakukan yang sebaliknya. Itu membuat kawat gigi {}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 dilarang
slebetman
10
@ Eiko Biarkan saya ulangi. Contoh dalam jawaban secara ambigu sintaksis , meskipun secara semantis tidak ambigu (seperti yang Anda catat). Tetapi karena fase parsing terjadi sebelum analisis semantik, parser akan menghadapi ambiguitas - dan itu harus membuat tebakan yang kurang informasi, atau gagal. Jika (karena alasan apa pun) pengurai memilih untuk tidak gagal, penganalisa semantik akan bekerja dengan pohon yang dihasilkan, apa pun itu. Saya belum melihat kompiler di mana analis semantik bersedia untuk meminta parser untuk memecah subtree dan membuat pilihan yang berbeda pada konstruksi ambigu sintaksis.
Theodoros Chatzigiannakis
21

Tanda kurung dalam ifpernyataan 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 dalam ifpernyataan digunakan untuk membatasi ekspresi boolean; yaitu, untuk membedakan ekspresi boolean dari sisa ifpernyataan.

Dalam sebuah ifpernyataan, tanda kurung tidak melakukan fungsi pengelompokan (meskipun, dalam ifpernyataan 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.

Robert Harvey
sumber
Saya tidak melihat bagaimana ini menyederhanakan kompiler. Aturan `pernyataan IF '(' ekspresi ')' tidak lebih sederhana dari IF primary_expression statement. Perhatikan bahwa yang terakhir sama-sama tidak ambigu.
user58697
@ user58697: Tidak, hanya yang terakhir memiliki ambiguitas di mana operator postfix aktif primary_expressiontidak 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 (
MSalters
@MSalters Operator postfix tidak mengurai sebagai primer. Ekspresi utama adalah salah satu dari IDENTIFIER, CONSTANT, STRING_LITERALdan '(' expression ')'.
user58697
@ user58697: Sepertinya Anda memiliki bahasa tertentu. Dan tampaknya memiliki aturan bahwa tanda kurung tidak diperlukan jika dan hanya jika syaratnya adalah "IDENTIFIER, CONSTANT atau STRING_LITERAL". Saya tidak yakin itu membuat segalanya lebih mudah.
MSalters
16

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:

if true
    +x;

Karena itu bisa diartikan sebagai:

if (true + x) {}

dari pada:

if (true) {+x;}

Sejumlah bahasa (misalnya Python) memungkinkan Anda menghindari tanda kurung tetapi masih memiliki penanda kondisi akhir:

jika Benar : + x

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:

 ++x;
 functionCall(1,2,3);

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]:

[statement] ++x;
[statement] functionCall(1,2,3);

Sekarang ambiguitas menghilang karena Anda harus menulis:

if true
    [statement] ++x;

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 forAnda akan menggunakan beberapa variasi unicode dari huruf-huruf f, odan r), sementara ekspresi menjadi Hanya ASCII.

Bakuriu
sumber
2
Sebuah bahasa benar-benar ada yang menggunakan penanda pernyataan ekspresi seperti itu: Jika Anda ingin mengevaluasi ekspresi untuk efek sampingnya, Anda perlu secara eksplisit discardnilainya dalam Nim . Namun, itu hanya dilakukan untuk keamanan tipe, bukan karena alasan sintaksis.
amon
@amon Bagus, saya tidak tahu tentang itu. Lagi pula, seperti yang saya katakan penanda tidak benar-benar diperlukan, itu hanya cara sederhana untuk mencapai perbedaan itu tanpa menciptakan sintaksis yang tidak intuitif.
Bakuriu
1
@amon - banyak varian BASIC juga memiliki pemisahan ketat antara ekspresi dan pernyataan. Ekspresi hanya diperbolehkan di tempat-tempat di mana nilai sebenarnya akan digunakan (mis. Penugasan variabel, pernyataan seperti PRINT yang melakukan tindakan, dan sebagainya). Prosedur yang tidak digunakan untuk menghitung nilai dipanggil oleh kata kunci (biasanya "CALL", meskipun setidaknya satu varian saya mengetahui penggunaan "PROC") yang mengawali nama mereka. Dan seterusnya. BASIC biasanya membatasi akhir ekspresi dalam pernyataan IF dengan "THEN", tetapi saya tidak melihat alasan teknis bahwa persyaratan tidak dapat dibatalkan.
Periata Breatta
1
Ada bahasa yang sangat populer di tahun 80-an yang memiliki blok tanpa paren, kawat gigi, titik dua, atau penanda lain dan menerima ekspresi sebagai pernyataan di mana-mana dan beberapa pernyataan bertindak seperti ekspresi (operator gabungan seperti + = dan ++). Lebih buruk lagi, ada prosesor pra-bodoh sebelum kompiler ( ?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).
Maniero
@bigown Mereka mencapainya dengan menggunakan sintaks terpisah untuk kondisi-logis, jadi, pada dasarnya, kondisi untuk if, whileecc 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.
Bakuriu
10

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, fordan kondisi pernyataan yang serupa. Jadi sesuatu seperti ini sangat valid di Perl 6:

if $x == 4 {
    ...
}

dengan adanya

while $queue.pop {
    ...
}

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:

if x == 4 {
    ...
}

Menurut saya, fitur bahasa C-terinspirasi yang lebih modern adalah melihat hal-hal seperti ini dan bertanya-tanya tentang cara menghapusnya.

Matthew Walton
sumber
Meskipun jawaban Anda memberikan beberapa wawasan tentang bahasa lain, itu tidak menjawab "Mengapa sintaks aneh ini ada dan mengapa begitu umum?"
Anda benar sekali. Saya benar-benar ingin menambahkan konteks pada pertanyaan, yang bukan sesuatu yang mudah dilakukan di platform ini. Saya kira pada akhirnya jika saya memberikan jawaban untuk pertanyaan itu "hanya karena, karena tidak ada alasan teknis tata bahasa tidak dapat mengakomodasi tidak memilikinya". Tapi itu bukan jawaban yang sangat berguna.
Matthew Walton
Di Perl 5 ada keduanya. Untuk konstruksi normal if atau loop dengan BLOCK, parens diperlukan, misalnya dalam if ( $x == 4 ) { ... }atau foreach my $foo ( @bar ) { ... }. Ketika notasi postfix digunakan parens adalah opsional, seperti dalam return unless $foo;atau ++$x while s/foo/bar/g;.
simbabque
6

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

if (x = getValue() == 42) { ... }

atau

if (x == y = 47) { ... }

atau

unsigned int n = 0 /* given m == SOME_VALUE */;
while (n < m && *p1++ = *p2++) { n++; }

(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

if (x = 17);

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.

sebuah CVn
sumber
5

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 memerlukan blockkode mati eksplisit , Anda bisa menggunakan pernyataan sederhana.

if (a == d) doIt()

atau Anda bisa menggabungkan pernyataan bersama menjadi compound statementdengan memasukkannya{}

Kami menyukai kompiler untuk menemukan kesalahan yang kami buat dan berikan sebagai pesan kesalahan yang bisa kami pahami.

Ian
sumber
3

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, whiledan switchpernyataan.

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 THENyang 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 dari IF 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, whiledan switch 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.

David K.
sumber
Saya tidak yakin itu adil untuk mengatakan bahwa C ++ dirancang seperti itu "untuk merayu para programmer untuk menggunakan bahasa baru". Ingat C dengan kelas ?
CVn
@ MichaelKjörling Harus diakui, pengembang Java jauh lebih eksplisit tentang "merayu." Tetapi perhatikan bahwa artikel terkait mengutip, sebagai salah satu alasan mengapa Stroustrup memilih untuk memulai dengan C sebagai dasar bahasanya, bahwa C digunakan secara luas. Salah satu cara ini memberikan motivasi untuk tetap dekat dengan C adalah karena kode yang ada dapat dengan mudah diadaptasi (seperti yang telah saya sebutkan) - tetapi juga coders yang ada dapat dengan mudah beradaptasi.
David K
@ MichaelKjörling Saya kira kata-kata asli dari jawaban saya menyarankan bahwa "merayu" adalah faktor yang lebih besar dalam desain bahasa daripada yang sebenarnya. Saya telah mengedit jawaban untuk mencoba menjelaskan bahwa itu hanya satu hal yang diperhitungkan dalam desain bahasa.
David K
3

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 dengan if (a) ++b;atau if (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.

Alfe
sumber
Saya melihat downvote pada jawaban saya. Mohon berbaik hati menjelaskan dalam komentar apa yang tidak Anda sukai tentang itu. Mungkin saya bisa memperbaikinya kalau begitu.
Alfe
0

Tanda kurung di sekitar ifkondisi tidak diperlukan dalam Fortran, Cobol, PL / 1, Algol, Algo-68, Pascal, Modula, XPL, PL / M, MPL, ... atau bahasa lain apa pun yang memiliki thenkata kunci. thenberfungsi untuk membatasi conditiondari berikut ini statement.

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.

pengguna207421
sumber
Fortran memang membutuhkan tanda kurung di semua versi IF-nya, termasuk struktural.
Netch