Neden diller “if” ve “while” ile kullanıldığında ifadelerin etrafına parantez gerektiriyor?


67

Bir kullanıldığında C, Java ve C gibi diller ++ bütün bütün bir ifadenin etrafında parantez gerektiren if, whileya switch.

if (true) {
    // Do something
}

aksine

if true {
    // Do something
}

Bu bana tuhaf geliyor çünkü parantez gereksiz. Bu örnekte, truekendi başına tek bir ifadedir. Parantez, anlamını bildiğim hiçbir şekilde değiştirmiyor. Bu tuhaf sözdizimi neden var ve neden bu kadar yaygın? Farkında olmadığım bir yararı var mı?


20
Pascal (bir gerektirdiğinden parantez gerektirmez THEN).
JimmyB,

30
Python, Ruby yok.
smci

31
C'nin parantez kullandığına inanıyorum, çünkü parantez bir tek ifadeli gövdede isteğe bağlı. Belki de koymak için daha iyi bir yol, parantezlerin ififadenin bir parçası olmadığı , sadece bileşik bir açıklama oluşturduklarıdır.
Fred Larson,

7
Git, ilginç, parantez gerektirir ancak parantez değil.
Kos,

25
Soru biraz tautolojiktir. Yuvarlak menhol kapakları neden yuvarlaktır? Neden tüm erkek kardeşler erkek? Neden paren-zorunlu dillerin hepsi parens gerektiriyor? Yuvarlak rögar kapakları tanım olarak yuvarlaktır; kardeşler tanımı gereği erkektir; parens gerektiren diller tanım gereği parens gerektirir.
Eric Lippert

Yanıtlar:


155

Olması gerekir bazı koşul biter ve şube nerede başladığını söylemenin yolu. Bunu yapmanın birçok farklı yolu vardır.

Bazı dillerde, hiçbir koşul vardır hiç Smalltalk, Öz, tellalların, Io, Ioke, Seph ve Fancy örn. Koşullu dallanma, basit bir şekilde diğer herhangi bir yöntem gibi normal bir yöntem olarak uygulanır. Bu yöntem, boolean nesnelerine uygulanır ve bir boolean'a çağrılır. Bu şekilde, koşul basitçe yöntemin alıcısıdır ve iki dal iki argümandır, örneğin Smalltalk:

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

Java'yı daha iyi tanıyorsanız, bu aşağıdakine eşittir:

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

Lisp dil ​​ailesinde, durum benzer: şartlı ifadeler sadece normal fonksiyonlardır (aslında makrolar) ve birinci argüman şarttır, ikinci ve üçüncü argüman dallardır, bu nedenle bunlar normal fonksiyon argümanlarıdır ve onları sınırlandırmak için özel bir şeye gerek yok:

(if aBooleanExpression 23 42)

Bazı diller sınırlayıcı olarak anahtar kelimeler kullanır, örneğin Algol, Ada, BASIC, Pascal, Modula-2, Oberon, Oberon-2, Aktif Oberon, Bileşen Pascal, Zonnon, Modula-3:

IF aBooleanExpression THEN RETURN 23 ELSE RETURN 42;

Ruby'de, bir anahtar kelime veya ifade ayırıcı kullanabilirsiniz (noktalı virgül veya yeni satır):

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 , dalların bloklar olmasını gerektirir ve küme parantezlerini zorunlu kılan ifadelere veya ifadelere izin vermez. Bu nedenle, parantez gerekli değildir, ancak isterseniz ekleyebilirsiniz; Perl6 ve Rust bu konuda benzer:

if aBooleanExpression { return 23 } else { return 42 }

Bazı diller, koşulu sınırlamak için diğer alfasayısal olmayan karakterleri kullanır, örneğin Python:

if aBooleanExpression: return 23
else: return 42

Kısacası: İhtiyacınız bazı koşul biter ve şube nerede başladığını anlatan yolu. Bunu yapmanın birçok yolu vardır, parantezler bunlardan sadece bir tanesidir.


8
Çok iyi bir bakış.
Peter - Monica

2
Tabii ki, ya çıplak ifadelerin bir ifade olmadığı bir dilde (örneğin, hesaplanan bir değerin bir değişkene atanması veya başka bir ifadeye geçirilmesi gereken eski BASIC gibi bir şey) veya her zaman önek operatörlerinin olmadığı bir dilde Bir ifadenin sonunu ve zaten bir ifadenin başlangıcını tanımlamak için. Bir IF ifadesinin sonunda sınırlayıcı olmadan yönetilen bir BASIC değişkenini kesinlikle görebiliyordum.
Periata Breatta

4
Ayrıca, C 70'lerde tasarlandığından ve hesaplama pahalı olduğundan, küçük bir parantez eklemek, çözümleyicinin yazmasını biraz daha kolaylaştıracaktı.
Machado

4
Re: Lisp: "aslında, makrolar". Uygulamada IF, Şema ve CL'de özel bir formdur (sadece eksiksiz olması için).
coredump,

1
@Leushenko: Örneğin, varsayılan olarak tembel olan MISC'de, koşullu formların tümü sadece normal fonksiyonlardır, ne makrolar ne de özel formlar. (Gerçekten, AFAIR, MISC sıfır özel formlara sahip mi?)
Jörg W Mittag

70

Parantez kullanıyorsanız parantez gerekli değildir.

if true ++ x;

Örneğin onlarsız belirsizleşir.


28
@RobertHarvey - Parantez , farkında olduğum her dil tarafından isteniyor. Kesinlikle C ve akrabası. Onlar niye OP istiyor edilir gerekli - ve dil aksi belirsiz olacak çünkü bu.
Telastyn

25
Başımın hemen üstünde, parantez içinde gerekli değildir if: temel, montaj, python, bash / zsh, tcl, toplu iş, beyin ya da makine kodu. Eksik parantez, ifeğer dil onlara bağlı olarak tasarlandıysa belirsizleşir.
candied_orange

12
En mantıklı ve okunabilir versiyondan kimsenin bahsetmediğinden şaşırdım - Pascal'da (Delphi dahil) if Condition then ....
Ulrich Gerhardt

18
Go, tam tersini yapmanın iyi bir örneğidir. Diş tellerini {}zorunlu kılar ve bu nedenle ifadenin etrafında parens gerektirmez. Sadece parenler gerekli değildir, ancak doğru bir şekilde parens eklemeyi hatırlıyorsam derleme hatasına neden olur - yasaklar
slebetman

10
@Eiko Tekrar söylememe izin ver. Yanıttaki örnek, anlamsal olarak belirsiz olsa da (belirttiğiniz gibi) , sözdizimsel olarak belirsizdir . Ancak ayrıştırma aşaması anlamsal analizden önce gerçekleştiğinden, ayrıştırıcı belirsizlikle karşılaşacaktır - ve ya bilgisiz bir tahmin yapmalı ya da başarısız olmalıdır. (Herhangi bir sebepten dolayı) çözümleyici başarısız olmamayı seçerse, semantik analizör ne olursa olsun, elde edilen ağaçla çalışacaktır. Anlambilimsel analizörden, çözümleyiciden alt ağacı yeniden satın almasını ve sözdizimsel olarak belirsiz yapıda farklı bir seçim yapmasını istediği bir derleyici görmedim.
Theodoros Chatzigiannakis

21

Bir in parantezler ifaçıklamada bir aritmetik ifadelerinde kullanılmak parantez aynı anlama sahip değildir. Aritmetik ifadedeki parantezler ifadeleri birlikte gruplamak için kullanılır. Bir ifdeyimdeki parantezler, boolean ifadesini sınırlandırmak için kullanılır; yani, boolean ifadesini ifadenin geri kalanından ayırmak için kullanılır if.

Bir ififadede, parantezler gruplama işlevi gerçekleştirmezler ( ififadede, parantezleri aritmetik ifadeleri gruplandırmak için yine de kullanabilirsiniz. Ancak, parantez içindeki dış küme, tüm bool ifadesini sınırlandırmak için kullanılır). Onları gerekli kılmak derleyiciyi basitleştirir çünkü derleyici her zaman orada bulunan parantezlere güvenebilir.


Derleyiciyi nasıl basitleştirdiğini anlamıyorum. 'IF' ('expression') 'deyimi` kuralı bundan daha basit değildir IF primary_expression statement. Ikincisi aynı derecede açık olduğuna dikkat edin.
user58697

@ user58697: Hayır, yalnızca ikincisi, bir postfix primary_expressionoperatörünün, bir expression-deyimindeki bir prefix operatöründen ayırt edilemeyeceği bir belirsizliğe sahiptir . Telastyn'in cevabını kopyalamak için if true ++ x;. Ayrıca, boş ifadeler varsa, koşulun içinde if a & f;boş bir ifade ve ikili &ya &da ifadenin başlangıcında bir unary olabilir . Parantez eşleşen Fakat (bir maç açılışı için tam orada
MSalters

BIR sonek operatörü @MSalters değil birincil olarak ayrıştırmak. Bir birincil ifade biri IDENTIFIER, CONSTANT, STRING_LITERALve '(' expression ')'.
user58697,

@ user58697: Aklında belirli bir dili var gibi görünüyor. Ve parantezlerin gerekli olmadığı ve sadece şartların bir "KİMLİKLENEN, CONSTANT veya STRING_LITERAL" olması halinde gerekli olmadığı bir kurala sahip olduğu görülmektedir. Bunun işleri kolaylaştırdığından emin değilim.
MSalters

16

Diğerlerinin zaten kısaca belirttiği gibi, bunun nedeni ifadelerin de geçerli ifadeler olduğudur ve sadece bir ifadenin yer aldığı bir blok durumunda parantezleri bırakabilirsiniz. Bu, aşağıdakilerin belirsiz olduğu anlamına gelir:

if true
    +x;

Çünkü şu şekilde yorumlanabilir:

if (true + x) {}

onun yerine:

if (true) {+x;}

Bir dizi dil (örn. Python) parantezden kaçınmanıza izin verir ancak yine de bir son durum işaretçisine sahiptir:

eğer Doğru ise : + x

Ancak biz bu haklı olabilir bir ifadedir bir dil: parantez gerekli asla bir dil tanımlamak değil , geçerli bir deyim bu sorunu olmayacaktır.

Maalesef bu şöyle şeyler anlamına gelir:

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

olurdu değil sen ifadeleri yaratmadan tür eylemleri gerçekleştirmek edebilmek için bazı garip sözdizimi tanıtmak olurdu böylece, geçerli ifadeleri ol. Bunu yapmanın basit bir yolu, ifadeyi aşağıdaki gibi bir işaretleyici ile hazırlamaktır [statement]:

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

Şimdi belirsizlik yazmanız gerekeceğinden kayboluyor:

if true
    [statement] ++x;

Ancak görebildiğiniz gibi, parantezi bir ifkoşullandırma (ya :da sonundaki) etrafına parantez koymak, her ifade ifadesi için böyle bir işaretçi koymaktan çok daha iyi olduğundan, böyle bir dilin yaygın olduğunu görmüyorum .


Not : Bir [statement]işaretleyicinin kullanımı, düşünebildiğim en basit sözdizimidir. Bununla birlikte , ifadeler ve ifadeler için, aralarında böyle bir belirleyici gerektirmeyecek belirsizliği olmayan iki ayrı sözdiziminiz olabilir . Sorun şudur: Dil aynı ifadeyi veya ifadede aynı şeyleri yapmak için tamamen farklı bir sözdizimi kullanmak zorunda kalacağınız için çok tuhaf olurdu.

Kuvvet ifadeleri unicode sembolleri kullanmak (bu yüzden yerine: örneği için böyle açık bir işaretleyici olmadan iki ayrı sözdizimi olması akla gelen bir şey olurdu forsizin bazı harflerin Unicode varyasyonu kullanmayı tercih f, ove rifadeler olduğu süre) Sadece ASCII.


2
Aslında böyle bir ifade ifadesi işaretçisi kullanan bir dil vardır: Bir ifadeyi yan etkileri için değerlendirmek istiyorsanız, açıkça discardNim'deki değerini belirtmeniz gerekir . Ancak, bu sadece tip güvenliği için yapılır, sözdizimsel nedenlerden dolayı değildir.
07:16

@ Amon Nice, bunu bilmiyordum. Her neyse, belirttiğim gibi marker gerçekten gerekli değil, sezgisel olmayan sözdizimleri icat etmeden bu ayrımı elde etmek için basit bir yoldur.
Bakuriu

1
@ amon - Birçok BASIC varyantı ayrıca ifadeler ve ifadeler arasında katı bir ayrım yapar. İfadelere yalnızca değerin gerçekten kullanılacağı yerlerde izin verilir (örn. Değişken atamaları, eylem gerçekleştiren PRINT gibi ifadeler vb.). Bir değeri hesaplamak için kullanılmayan prosedürler, isimlerini ön ekleyen bir anahtar kelime (genellikle "ÇAĞRI", ancak en az bir varyantın "PROC" kullandığını bildiğim halde ") tarafından çağrılır. Ve bunun gibi. BASIC genellikle "THEN" yazılı bir IF ifadesinde ifadenin sonunu sınırlar, ancak bu gereksinimin düşmemesi için teknik bir neden göremiyorum.
Periata Breatta

1
80'li yıllarda çok sayıda dilin, parantezin, ayraçın veya başka bir işaretçinin olmadığı blokları olan ve ifadeleri her yerde ifadeler olarak kabul eden ve bazı ifadelerde ifadeler gibi davranan bir dil var (+ = ve ++ gibi bileşik operatörler). Endişe verici, derleyiciden önce aptal bir ön işlemci var ( ?örneğin, aslında PP'den sonra bir fonksiyondur). Yok ;. Tabii, devam çizgisi için bir işaretleyiciye ihtiyacı var, ancak bu önerilmez. harbour.github.io/doc/clc53.html#if-cmd . Derleyici hızlı ve basittir (Bison / Flex ile hazırlanmıştır).
Maniero

@bigown Temelde, mantıksal-koşullar için ayrı bir sözdizimi kullanarak, bu yüzden tarafından, koşulları Bunu başarmak if, whileecc sınırlı diğer dillerde kullanılan jenerik ifadeleri karşılaştırılır. Tabii: ikiden fazla sözdizimsel kategoriniz varsa (ifade, ifade, mantıksal ifade, kahve yapma ifade, ... gibi), biraz serbestlik kazanabilirsiniz.
Bakuriu,

10

C ailesi dillerinin bu parantezleri alması yaygındır, ancak evrensel değildir.

Perl 6'nın daha fark sözdizimsel değişikliklerden biri size parantez etrafında vermek zorunda kalmamak için onlar dilbilgisi değiştirilmiş olmasıdır if, forve benzeri tablolarda raporlanan koşulları. Yani bunun gibi bir şey Perl 6'da tamamen geçerli:

if $x == 4 {
    ...
}

olduğu gibi

while $queue.pop {
    ...
}

Ancak, sadece ifadeler oldukları için, isterseniz etraflarına parantez koyabilirsiniz, bu durumda sözdiziminin C, C #, Java vb.

Rust, bu bölümdeki Perl 6 ile benzer bir sözdizimine sahiptir:

if x == 4 {
    ...
}

Bana göre daha modern C'den ilham alan dillerin bir özelliği, bu gibi şeylere bakmak ve bunları kaldırmaktan korkmak gibi görünüyor.


Cevabınız diğer diller hakkında biraz fikir verirken, "Neden bu tuhaf sözdizimi var ve neden bu kadar yaygın?"

Çok haklısın. Bu platformda yapması kolay olmayan bir soruya bağlam eklemek istiyordum. Sanırım nihayetinde, "çünkü, gramerin onlara sahip olmamak için teknik bir sebep olmadığından" olduğu sorusuna bir cevap verirsem. Fakat bu çok kullanışlı bir cevap değil.
Matthew Walton,

Perl 5'te her ikisi de var. Bir için normal bir if blok ya da halka yapıları, parens örn gereklidir if ( $x == 4 ) { ... }veya foreach my $foo ( @bar ) { ... }. Postfix notasyonu kullanıldığında parens isteğe return unless $foo;ya da olduğu gibi isteğe bağlıdır ++$x while s/foo/bar/g;.
simbabque,

6

Mevcut cevapların hiçbirinin ortaya çıkmamasına şaşırdığım bir yön var.

C ve birçok C türevi ve benzerleri, bir atamanın değerinin atanmış değer olması bakımından bir özelliğe sahiptir . Bunun bir sonucu, bir değerin beklendiği durumlarda bir ödevin kullanılabileceğidir.

Bu gibi şeyler yazmanıza olanak sağlar

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

veya

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

veya

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

(ki bu, while (n < m && *p1++ = *p2++ != 0) { n++; }C'nin sıfır olmayanı doğru olarak ele aldığından dolaylı olarak muamele görür ; bu arada, bunun C standart kütüphanesindeki strncpy () hakkında olduğunu düşünüyorum)

ya da

if (x = 17);

ve hepsi geçerlidir. Sözdizimsel olarak geçerli tüm kombinasyonların zorunlu olarak faydalı olması gerekmez (ve modern derleyiciler şartlı koşullar içindeki ödevler hakkında özellikle uyarırlar, çünkü bu yaygın bir hatadır), ancak bazıları gerçekten faydalıdır.

Koşullu ifadenin nerede başladığını ve bittiğini belirlemek için kesin bir yol olmasaydı, böyle ifadeleri ayrıştırmak muhtemelen çok daha zor olurdu.

Parantez, işlev adlarını işlev bağımsız değişkenlerinden ayırmak için zaten kullanıldı, bu nedenle anahtar kelimeleri bağımsız değişkenlerden ayırmak için doğal bir seçenek gibi görünüyorlardı.

Elbette, aynı şeyi yapmak için alternatif sözdizimleri tanımlanabilir. Ancak bunu yapmak, özellikle de aynı şey için iki farklı sözdizimi setiyle uğraşması gereken ayrıştırıcıda karmaşıklığı arttıracaktır. C tasarlanırken, hesaplama gücü (hem sayı alma yeteneği, çalışma belleği hem de depolama kapasitesi açısından) son derece sınırlıydı; karmaşıklığı çok az ya da okunabilirlik maliyeti düşük olan herhangi bir şey neredeyse kesinlikle hoş bir değişiklikti.

Bugün parantez kullanmak biraz arkaik görünebilir, ancak bu dil ile aşina olan birine verilen gibi değil, aynı şeyleri ifade edebilen bazı sözdizimlerine kıyasla okunabilirliği bozuyor.


5

Sebep çoğunlukla tarih.

İlk C derleyicisinin yazıldığı tarihte, bilgisayarlar çok sınırlı ram, cpu ve derleyicilerin derleyicilerin yazılmasına yardımcı olmak için birkaç araçla "elle yazılmış" derleyicileri vardır. Bu nedenle karmaşık kuralların bir derleyicide uygulanması maliyetlidir . C ++, C #, Java, vb. C programcılarının öğrenmesi kolay olacak şekilde tasarlanmıştır, bu nedenle “gereksiz” değişiklikler yapılmamıştır.

'C like' dilleri koşullu ( if, while, etc), açık bir blockkod gerektirmez , sadece basit bir ifade kullanabilirsiniz.

if (a == d) doIt()

veya ifadeleri bir araya getirerek bir araya compound statementgetirebilirsiniz.{}

Derleyicinin yaptığımız hatayı bulmasını ve anlayabileceğimiz bir hata mesajı olarak vermesini seviyoruz.


3

Java ve C ++, C çok popüler bir programlama dili haline geldikten sonra geliştirilmiştir. Bu dillerin her birinin tasarımında dikkat edilmesi gereken nokta, C programcılarına hitap etmesi ve bu programcıların yeni dili kullanmasıdır. (Başarılı bir şekilde yazdıkları C programcılarından biriydim.) C ++ ek olarak (neredeyse) C koduyla değiştirilebilecek şekilde tasarlandı. Bu hedefleri desteklemek amacıyla, hem C ++ ve Java koşulları etrafında parantez dahil C'nin sözdizimi çok benimsenen if, whileve switchtabloların.

Bu nedenle, tüm bu dillerin bu ifadelerin koşulları etrafında parantez gerektirmesinin nedeni, C'nin neden olduğu ve soru gerçekten de C'nin neden parantez gerektirdiğidir.

C dilinin kökenleri açıklanmıştır Dennis Ritchie, gelişiminin başlıca yazarlardan biri tarafından bu makalede (hatta bazıları diyebilirsiniz gelişiminin başlıca yazar). Bu makalede belirtildiği gibi, C aslen 1970'lerin başında ana bellekte son derece sınırlı alana sahip bilgisayarlar için bir sistem programlama dili olarak geliştirilmiştir. Toplama dilden daha yüksek bir dile sahip olmak istendi, ancak çalışılabilecek kaynaklar göz önüne alındığında, dilin ayrıştırma kolaylığı da önemliydi. Parantezlerin kullanılması, koşullu kodun tanımlanmasını nispeten kolaylaştıracaktır.

Ayrıca, daha az karakter kullanan programlar yazma yeteneğinin bir avantaj olduğu düşünülebilir ve iki parantez THENFORTRAN ve diğer yüksek seviye dillerde kullanılan anahtar kelimeden daha az yer kaplar ; Aslında, parantezler ayrıca boşlukları sembollerin sınırlayıcıları olarak değiştirebildiklerinden if(a==b), dört karakterden daha kısa olmuştur IF a==b THEN.

Her halükarda, insanların C ile yazılmış programları ne kadar kolay okuyabileceği, yazabileceği ve anlayabileceği, bir derleyicinin C ile yazılmış programları ne kadar kolay ayrıştırabileceği ve derleyebileceği ve kaç kilobayt (!) Arasında bir miktar denge kurulması gerekiyordu. Hem program kaynağı hem de derleyici için gerekli olacaktır. Ve koşulları etrafında parantez if, whileve switch tabloların insanlar C. tasarımında bu denge kurmak seçtik nasıldı

Diğer bazı cevaplarda da kanıtlandığı gibi, C'nin geliştirildiği belirli koşulları ortadan kaldırdığınızda, çeşitli programlama dillerinin koşullarında her türlü alternatif sözdizimi formları kullanılmıştır. Bu yüzden parantezler gerçekten de, tarihin belli bir döneminde belli kısıtlamalar altındaki birkaç kişi tarafından verilen bir tasarım kararından kaynaklanıyor.


C ++ 'ın "bu programcıları yeni bir dil kullanmaya ikna etmek için" olduğu gibi tasarlandığını söylemenin adil olduğundan emin değilim. C'yi sınıflarla hatırladın mı?
CVn

@ MichaelKjörling Kuşkusuz, Java geliştiricileri "wooing" hakkında çok daha açıktı. Ancak bağlantılı makalenin, Stroustrup'un dilinin temeli olarak C ile başlamayı seçmesinin bir nedeni olarak, C'nin yaygın olarak kullanıldığını gösterdiğine dikkat edin. Bunun C'ye yakın kalmak için bir motivasyon sağlamanın bir yolu, mevcut kodun kolayca uyarlanabilmesiydi (daha önce de belirttiğim gibi) - fakat mevcut kodlayıcılar da kolayca uyum sağlayabiliyordu.
David K,

@ MichaelKjörling Sanırım cevabımın orjinal ifadesi, "wooing" in dil tasarımında gerçekte olduğundan daha büyük bir faktör olduğunu ileri sürdü. Cevabı , dil tasarımına dahil olan sadece bir şey olduğunu açıklığa kavuşturmak için düzenlemiştim .
David K,

3

Buradaki birçok neden parantez olmadan sözdiziminin belirsiz olması ve sessizce bunun bir şekilde kötü, hatta imkansız bir durum olacağını ima etmesidir.

Aslında, dillerin belirsizliklerle baş etmenin birçok yolu vardır. Operatör önceliği bu konunun sadece bir örneğidir.

Hayır, belirsizlik parantez içinde değildir. Sanırım bir kimse koşulun etrafındaki parantezleri gerektirmeyen (böylece isteğe bağlı kılan) ve yine de her durumda geçerli bir kod oluşturan bir C sürümü yaratabilir. Örneği, if a ++ b;eşdeğer olarak yorumlanabilir if (a) ++b;veya if (a++) b;hangisi daha uygun görünüyorsa.

Dennis Ritchie'nin () neden zorunlu hale getirmeyi seçtiği (ve dolayısıyla bu memeyi türetilmiş diller için kullandığı) sorusu, dilsel bir konudur. Sanırım, durumun bir emirden ziyade bir ifade olduğunu ifade etme düşüncesi, düşüncenin babasıydı.

Ve aslında, C tek geçişli bir çözümleyici kullanılarak ayrıştırılabilir olarak tasarlanmıştır. Koşul etrafında zorunlu parantez ile bir sözdizimi kullanmak bu yönü desteklemektedir.


Cevabımda bir aşağı oy görüyorum. Lütfen bir yorumda neyi beğenmediğinizi açıklamaktan nezaketiniz. Belki daha sonra geliştirebilirim.
Alfe

0

ifFortran, Cobol, PL / 1, Algol, Algo-68, Pascal, Modül, XPL, PL / M, MPL, ... veya thenanahtar kelimeye sahip başka bir dilde şartların etrafına parantez gerekmez . aşağıdakilerden thensınırlandırmaya yarar .conditionstatement

C'deki kapanış parantezi şu şekilde çalışır thenve açık olan resmen gereksizdir.

Yukarıdaki açıklamalar geleneksel olarak ayrıştırılan dillere uygulanır.


Fortran , yapısal olanı da dahil olmak üzere IF'nin tüm versiyonlarında parantez gerektirmektedir.
Netch
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.