Dlaczego języki wymagają nawiasów wokół wyrażeń, gdy są używane z „if” i „while”?

67

Języki takie jak C, Java i C ++ wszystko wymaga nawiasów wokół całego wyrażenia stosowane w sposób if, whilelub switch.

if (true) {
    // Do something
}

w przeciwieństwie do

if true {
    // Do something
}

Wydaje mi się to dziwne, ponieważ nawiasy są zbędne. W tym przykładzie truejest pojedynczym wyrażeniem. Nawiasy nie zmieniają jego znaczenia w żaden znany mi sposób. Dlaczego istnieje ta dziwna składnia i dlaczego jest tak powszechna? Czy jest to jakaś korzyść, której nie jestem świadomy?

Velovix
źródło
20
Pascal nie wymaga nawiasów (ponieważ wymaga a THEN).
JimmyB,
30
Python, Ruby nie.
smci
31
Uważam, że C używa nawiasów, ponieważ nawiasy klamrowe są opcjonalne dla treści pojedynczej instrukcji. A może lepiej to powiedzieć, że nawiasy klamrowe nie są częścią ifinstrukcji, po prostu tworzą instrukcję złożoną.
Fred Larson,
7
Co ciekawe, Go wymaga nawiasów klamrowych, ale nie nawiasów.
Kos,
25
Pytanie jest nieco tautologiczne. Dlaczego okrągłe pokrywy włazów są wszędzie? Dlaczego wszyscy bracia są mężczyznami? Dlaczego wszystkie języki wymagające paren wymagają parens? Okrągłe pokrywy włazów są z definicji okrągłe; bracia z definicji są mężczyznami; języki wymagające parens wymagają parens z definicji.
Eric Lippert,

Odpowiedzi:

155

Musi być jakiś sposób na określenie, gdzie kończy się warunek, a zaczyna gałąź. Można to zrobić na wiele różnych sposobów.

W niektórych językach istnieją żadne warunkowe w ogóle , na przykład w Smalltalk, Self, nowomowy, Io, Ioke, Seph, i ozdobne. Rozgałęzianie warunkowe jest po prostu implementowane jako normalna metoda, jak każda inna metoda. Metoda jest implementowana na obiektach boolean i zostaje wywołana na boolean. W ten sposób warunek jest po prostu odbiorcą metody, a dwie gałęzie są dwoma argumentami, np. W Smalltalk:

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

Jeśli znasz język Java, jest to równoważne z następującymi:

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

W rodzinie języków Lisp sytuacja jest podobna: warunkowe są zwykłymi funkcjami (właściwie makrami), a pierwszy argument jest warunkiem, drugi i trzeci argument to gałęzie, więc są to zwykłe argumenty funkcji, i jest nic specjalnego nie jest potrzebne do ich rozgraniczenia:

(if aBooleanExpression 23 42)

Niektóre języki używają słów kluczowych jako ograniczników, np. Algol, Ada, BASIC, Pascal, Modula-2, Oberon, Oberon-2, Active Oberon, Component Pascal, Zonnon, Modula-3:

IF aBooleanExpression THEN RETURN 23 ELSE RETURN 42;

W Ruby możesz użyć słowa kluczowego lub separatora wyrażeń (średnik lub znak nowej linii):

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 wymaga, aby gałęzie były blokami i nie dopuszcza wyrażeń ani instrukcji, co sprawia, że ​​nawiasy klamrowe są obowiązkowe. Dlatego nawiasy nie są wymagane, chociaż możesz je dodać, jeśli chcesz; Perl6 i Rust są podobne pod tym względem:

if aBooleanExpression { return 23 } else { return 42 }

Niektóre języki używają innych znaków niealfanumerycznych do określenia warunku, np. Python:

if aBooleanExpression: return 23
else: return 42

Najważniejsze jest to: trzeba jakiś sposób mówienia gdzie stan kończy się i zaczyna się gałąź. Można to zrobić na wiele sposobów, nawiasy są tylko jednym z nich.

Jörg W Mittag
źródło
8
Bardzo dobry przegląd.
Peter A. Schneider,
2
oczywiście w języku, w którym nagie wyrażenia nie są instrukcjami (np. starszym językiem BASIC, w którym obliczona wartość musi być przypisana do zmiennej lub przekazana do innej instrukcji) lub w którym nie ma operatorów prefiksów, zawsze powinieneś być w stanie w każdym razie, aby zidentyfikować koniec wyrażenia i początek wyrażenia. Zdecydowanie mogłem zobaczyć wariant BASIC zarządzający bez separatora na końcu instrukcji IF.
Periata Breatta
4
Ponadto, ponieważ C został zaprojektowany w latach 70-tych, a obliczenia były drogie, dodanie małego nawiasu prawdopodobnie ułatwiłoby parser nieco łatwiejsze pisanie.
Machado,
4
Re: Lisp: „właściwie makra”. W praktyce IF jest specjalną formą w schemacie i CL (tylko dla kompletności).
coredump
1
@Leushenko: I np. W MISC, który jest domyślnie leniwy, wszystkie formy warunkowe są zwykłymi funkcjami, ani makrami, ani formularzami specjalnymi. (Rzeczywiście, AFAIR, MISC ma zero specjalnych formularzy?)
Jörg W Mittag,
70

Nawiasy są niepotrzebne tylko w przypadku użycia nawiasów klamrowych.

if true ++ x;

Bez nich staje się na przykład dwuznaczny.

Telastyn
źródło
28
@RobertHarvey - Nawiasy wymagane przez prawie każdy język, którego znam. Z pewnością C i jego krewni. OP pyta, dlaczego są one wymagane - a to dlatego, że inaczej język stałby się dwuznaczny.
Telastyn,
25
Tuż po mojej głowie nawiasy nie są wymagane ifw: podstawowym, asemblerowym, pythonowym, bash / zsh, tcl, wsadowym, bzdurnym lub kodzie maszynowym. Brak nawiasów sprawia, że ifdwuznaczność staje się dwuznaczna tylko wtedy, gdy język został zaprojektowany tak, aby na nich polegać.
candied_orange
12
Dziwi mnie, że nikt nie wspomniał o najbardziej logicznej i czytelnej wersji - w Pascalu (w tym Delphi) to if Condition then ....
Ulrich Gerhardt,
18
Go jest dobrym przykładem działania przeciwnego. To sprawia, że ​​nawiasy klamrowe są {}obowiązkowe i dlatego nie wymagają parens wokół wyrażenia. Nie tylko pareny nie są wymagane, ale jeśli dobrze pamiętam, dodawanie parens spowodowałoby błąd kompilacji - są zabronione
Slebetman
10
@Eiko Pozwól, że powtórzę. Przykład w odpowiedzi jest niejednoznaczny pod względem składniowym , nawet jeśli jest semantycznie jednoznaczny (jak zauważyłeś). Ale ponieważ faza analizowania odbywa się przed analizą semantyczną, analizator składni napotka dwuznaczność - musi albo zgodzić się z niedoinformowaniem, albo zawieść. Jeśli (z jakiegokolwiek powodu) analizator składniowy zdecyduje się nie zawieść, analizator semantyczny będzie pracował z wynikowym drzewem, cokolwiek to jest. Nie widziałem kompilatora, w którym analizator semantyczny jest skłonny poprosić analizator składni o ponowne przeanalizowanie poddrzewa i dokonanie innego wyboru przy składniowo niejednoznacznej konstrukcji.
Theodoros Chatzigiannakis,
21

Nawiasy w ifinstrukcji nie mają tego samego znaczenia, co nawiasy używane w wyrażeniu arytmetycznym. Nawiasy w wyrażeniu arytmetycznym służą do grupowania wyrażeń razem. Nawiasy w ifinstrukcji służą do rozgraniczenia wyrażenia boolowskiego; to znaczy, aby odróżnić wyrażenie boolowskie od reszty ifinstrukcji.

W ifinstrukcji nawiasy nie wykonują funkcji grupowania (jednak w ifinstrukcji można nadal używać nawiasów do grupowania wyrażeń arytmetycznych. Zewnętrzny zestaw nawiasów służy następnie do ograniczenia całego wyrażenia boolowskiego). Wymaganie ich upraszcza kompilator, ponieważ kompilator może polegać na tych nawiasach, które zawsze tam są.

Robert Harvey
źródło
Nie rozumiem, jak to upraszcza kompilator. Reguła „JEŻELI” („wyrażenie”) „instrukcja” nie jest prostsza niż IF primary_expression statement. Zauważ, że ta ostatnia jest równie jednoznaczna.
user58697,
@ user58697: Nie, tylko ta ostatnia ma dwuznaczność, w której operator postfiksowy na primary_expressionnie może być odróżniony od operatora prefiksu w wyrażeniu-wyrażeniu. Aby skopiować odpowiedź Telastyn, w if true ++ x;. Ponadto, jeśli istnieją puste instrukcje, if a & f;może to być albo pusta instrukcja i plik binarny &wewnątrz warunku, albo jednoargumentowy &na początku instrukcji. Ale podczas dopasowywania nawiasów jest dokładnie jedno dopasowanie do otwarcia (
MSalters
@MSalters Operator Postfiks nie analizuje jako podstawowy. Podstawowym wyrażenia jest IDENTIFIER, CONSTANT, STRING_LITERALi '(' expression ')'.
user58697,
@ user58697: Wygląda na to, że masz na myśli określony język. Wydaje się, że obowiązuje reguła, że ​​nawiasy nie są potrzebne wtedy i tylko wtedy, gdy warunki to „IDENTIFIER, CONSTANT or STRING_LITERAL”. Nie jestem pewien, czy to ułatwia sprawy.
MSalters
16

Jak inni już częściowo zauważyli, wynika to z faktu, że wyrażenia są również prawidłowymi instrukcjami, aw przypadku bloku z jedną instrukcją można upuścić nawiasy klamrowe. Oznacza to, że następujące są niejednoznaczne:

if true
    +x;

Ponieważ można to interpretować jako:

if (true + x) {}

zamiast:

if (true) {+x;}

Wiele języków (np. Python) pozwala uniknąć nawiasów, ale nadal ma znacznik stanu końcowego:

jeśli prawda : + x

Jednak masz rację, że mógłby określić język, w którym nigdy nie są wymagane nawias: język gdzie wyrazem jest nie ważny oświadczenie nie ma tego problemu.

Niestety oznacza to, że takie rzeczy jak:

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

by nie być ważne oświadczenia, więc trzeba by wprowadzić pewne dziwne składni, aby móc wykonywać takie działania, bez tworzenia wyrażeń. Prostym sposobem na to jest po prostu poprzedzenie wyrażenia znacznikiem, takim jak [statement]:

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

Teraz dwuznaczność znika, ponieważ będziesz musiał napisać:

if true
    [statement] ++x;

Ale jak widać, nie widzę, aby taki język był rozpowszechniony, ponieważ umieszczenie nawiasu wokół ifwarunku (lub :jego końca) jest znacznie lepsze niż umieszczenie takiego znacznika dla każdej instrukcji wyrażenia.


Uwaga : użycie [statement]znacznika jest po prostu najprostszą składnią, jaką mogłem wymyślić. Jednak ty mógł mieć dwie całkowicie odrębne składnie dla wyrażenia i instrukcje bez dwuznaczności między nimi, które nie wymagają takiego znacznika. Problem polega na tym, że język byłby bardzo dziwny, ponieważ aby robić te same rzeczy w wyrażeniu lub instrukcji, musiałbyś użyć zupełnie innej składni.

Jedną rzeczą, która przychodzi do głowy, aby mieć dwa oddzielne składnie bez takiej wyraźnej markera byłoby, na przykład: sprawozdanie siły użyć symboli Unicode (więc zamiast forciebie by wykorzystać jakąś odmianę unicode liter f, oi r), natomiast wyrażenia się Tylko ASCII.

Bakuriu
źródło
2
W rzeczywistości istnieje język, który używa takiego znacznika wyrażenia: Jeśli chcesz ocenić wyrażenie pod kątem jego skutków ubocznych, musisz jawnie określić discardjego wartość w Nim . Jest to jednak zrobione dla bezpieczeństwa typu, a nie ze względów składniowych.
amon
@amon Nice, nie wiedziałem o tym. W każdym razie, jak powiedziałem, marker nie jest tak naprawdę potrzebny, to tylko prosty sposób na osiągnięcie tego rozróżnienia bez wymyślania nieintuicyjnych składni.
Bakuriu,
1
@amon - wiele wariantów BASIC ma również ścisłe oddzielenie wyrażeń i instrukcji. Wyrażenia są dozwolone tylko w miejscach, w których wartość zostanie faktycznie użyta (np. Przypisania zmiennych, instrukcje takie jak PRINT, które wykonują akcję itp.). Procedury, które nie są używane do obliczania wartości, są wywoływane przez słowo kluczowe (zwykle „CALL”, chociaż przynajmniej jeden wariant, który znam, używa „PROC”), który poprzedza ich nazwę. I tak dalej. BASIC zazwyczaj ogranicza koniec wyrażenia w instrukcji IF za pomocą „THEN”, ale nie widzę technicznego powodu, dla którego wymaganie nie mogło zostać odrzucone.
Periata Breatta
1
Istnieje język bardzo popularny w latach 80., który ma bloki bez parens, nawiasów klamrowych, dwukropków lub innego znacznika i akceptuje wyrażenia jako wyrażenia wszędzie, a niektóre wyrażenia działają jak wyrażenia (operatory złożone, takie jak + = i ++). Jest to worsrt, przed kompilatorem jest głupi preprocesor ( ?na przykład simbol w rzeczywistości jest funkcją po PP). Nie ma ;. Jasne, potrzebuje znacznika linii kontynuacji, ale jest to odradzane. harbour.github.io/doc/clc53.html#if-cmd . Kompilator jest szybki i prosty (stworzony za pomocą Bison / Flex).
Maniero
@bigown one osiągnąć za pomocą oddzielnego składnię logiczno-warunkach, tak, w zasadzie, warunki if, whileecc są ograniczone w porównaniu do ogólnych określeń stosowanych w innych językach. Jasne: jeśli masz więcej niż dwie kategorie składniowe (takie jak wyrażenie, wyrażenie, wyrażenie logiczne, ekspres do kawy, ...), możesz wymienić trochę swobody.
Bakuriu
10

Języki z rodziny C często wymagają tych nawiasów, ale nie są uniwersalne.

Jednym z bardziej zauważalnych zmian składniowych Perl 6 jest to, że oni gramatykę zmodyfikowany tak, aby nie dać nawiasy wokół if, fori warunki podobne wypowiedzi. Więc coś takiego jest doskonale poprawne w Perlu 6:

if $x == 4 {
    ...
}

jak jest

while $queue.pop {
    ...
}

Ponieważ jednak są to tylko wyrażenia, możesz je nawiasować, jeśli chcesz, w takim przypadku są to zwykłe grupowania zamiast wymaganej części składni, jak w C, C #, Java itp.

Rust ma podobną składnię jak Perl 6 w tym dziale:

if x == 4 {
    ...
}

Wydaje mi się, że cechą bardziej nowoczesnych języków inspirowanych językiem C jest patrzeć na takie rzeczy i zastanawiać się nad ich usunięciem.

Matthew Walton
źródło
Twoja odpowiedź zapewnia wgląd w inne języki, ale nie odpowiada: „Dlaczego istnieje ta dziwna składnia i dlaczego jest tak powszechna?”
Masz całkowitą rację. Naprawdę chciałem dodać kontekst do pytania, co nie jest łatwe w tej platformie. Wydaje mi się, że ostatecznie, jeśli udzielę odpowiedzi na pytanie, to „tylko dlatego, że ponieważ nie ma technicznego powodu gramatyka nie byłaby w stanie tego zrobić bez nich”. Ale to nie jest bardzo przydatna odpowiedź.
Matthew Walton
W Perlu 5 jest jedno i drugie. W przypadku konstrukcji normalnej if lub pętli z BLOKAMI wymagane są pareny, np. W if ( $x == 4 ) { ... }lub foreach my $foo ( @bar ) { ... }. Gdy używana jest notacja postfiksowa, pareny są opcjonalne, tak jak w return unless $foo;lub ++$x while s/foo/bar/g;.
simbabque
6

Dziwi mnie jeden aspekt, który nie przyniósł żadnej z istniejących odpowiedzi.

C, a także wiele pochodnych C i podobnych, ma tę cechę szczególną, że wartość przypisania jest wartością przypisaną. Konsekwencją tego jest to, że przypisanie może być użyte tam, gdzie oczekiwana jest wartość.

To pozwala ci pisać takie rzeczy jak

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

lub

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

lub

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

(co jest domyślnie traktowane tak, while (n < m && *p1++ = *p2++ != 0) { n++; }ponieważ C traktuje wartość niezerową jako prawdziwą; nawiasem mówiąc, myślę, że to tylko o strncpy () w standardowej bibliotece C)

lub nawet

if (x = 17);

i to wszystko jest ważne. Nie wszystkie kombinacje poprawne pod względem składniowym są z konieczności przydatne (a współczesne kompilatory szczególnie ostrzegają o przypisaniach wewnątrz warunkowych, ponieważ jest to częsty błąd), ale niektóre z nich są w rzeczywistości przydatne.

Analiza takich stwierdzeń byłaby prawdopodobnie znacznie trudniejsza, gdyby nie było jednoznacznego sposobu ustalenia, gdzie wyrażenie warunkowe zaczyna się i kończy.

Nawiasy były już używane do oddzielania nazw funkcji od argumentów funkcji, więc myślę, że wydawały się naturalnym wyborem do oddzielania słów kluczowych od argumentów słów kluczowych.

Oczywiście można zdefiniować alternatywne składnie, aby zrobić to samo. Ale zrobienie tego zwiększyłoby złożoność, szczególnie w parserze, który musiałby wówczas poradzić sobie z dwoma różnymi zestawami składni dla zasadniczo tej samej rzeczy. Kiedy projektowano C, moc obliczeniowa (zarówno pod względem zdolności do kruszenia liczb, pamięci roboczej i pojemności pamięci) była bardzo ograniczona; wszystko, co zmniejszało złożoność przy niskim lub zerowym koszcie czytelności, było prawie na pewno pożądaną zmianą.

Używanie nawiasów może dziś wydawać się nieco archaiczne, ale nie jest tak, że biorąc pod uwagę kogoś znającego język, pogarsza czytelność w porównaniu z inną składnią, która jest w stanie wyrazić te same rzeczy.

CVn
źródło
5

Powodem jest głównie historia.

W czasie, gdy pierwszy kompilator C został napisany, komputery mają bardzo ograniczoną pamięć RAM, procesor i kompilatory pisane „ręcznie” za pomocą kilku narzędzi, które pomagają twórcom kompilatorów. Dlatego skomplikowane reguły były kosztowne do wdrożenia w kompilatorze. C ++, C #, Java itp. Zostały zaprojektowane tak, aby programiści C mogli łatwo się uczyć, dlatego nie wprowadzono żadnych „niepotrzebnych” zmian.

W językach „c like” warunkowe ( if, while, etc) nie wymagają jawnego blockwyłączenia kodu, wystarczy użyć prostej instrukcji.

if (a == d) doIt()

lub możesz połączyć instrukcje razem w jeden compound statement, wstawiając je za pomocą{}

Lubimy kompilator, aby znaleźć błąd, który popełniamy i dać jako komunikat błędu, który możemy zrozumieć.

Ian
źródło
3

Zarówno Java, jak i C ++ zostały opracowane po tym, jak C stał się bardzo popularnym językiem programowania. Jedną z kwestii przy projektowaniu każdego z tych języków było to, że spodobałoby się programistom języka C i zachęciło tych programistów do korzystania z nowego języka. (Byłem jednym z programistów C, którym udało się uzyskać.) C ++ został dodatkowo zaprojektowany tak, aby był (prawie) wymienny z kodem C. W celu wsparcia tych celów, zarówno C ++ i Java przyjęła wiele składni C, łącznie z nawiasami wokół warunków if, whileoraz switchsprawozdania.

Stąd powodem, dla którego wszystkie te języki wymagają nawiasów wokół warunków tych stwierdzeń, jest to, że C tak, a pytanie jest tak naprawdę, dlaczego C wymaga tych nawiasów.

Początki języka C opisano w tym artykule Dennis Ritchie, jeden z głównych autorów jego rozwoju (niektórzy mogą nawet powiedzieć, że główny autor jego rozwoju). Jak powiedziano w tym artykule, C został pierwotnie opracowany na początku lat 70. XX wieku jako systemowy język programowania dla komputerów o wyjątkowo ograniczonej przestrzeni w pamięci głównej. Pożądane było posiadanie języka wyższego poziomu niż język asemblera, ale biorąc pod uwagę zasoby dostępne do pracy, łatwość jego analizy była również ważna. Wymaganie nawiasów ułatwiłoby identyfikację kodu warunkowego.

Można również wnioskować, że umiejętność pisania programów przy użyciu mniejszej liczby znaków została uznana za zaletę, a dwa nawiasy zajmują mniej miejsca niż słowo kluczowe THENużywane w FORTRAN i innych językach wysokiego poziomu w tym czasie; w rzeczywistości, ponieważ nawiasy mogą również zastępować spacje jako ograniczniki symboli, if(a==b)były o cztery całe znaki krótsze niż IF a==b THEN.

W każdym razie trzeba było zachować równowagę między tym, jak łatwo ludzie będą w stanie czytać, pisać i rozumieć programy napisane w C, jak łatwo kompilator może analizować i kompilować programy napisane w C, a liczbą kilobajtów (!) byłoby wymagane zarówno dla źródła programu, jak i samego kompilatora. I nawiasy wokół warunków if, whileoraz switch wypowiedzi było to, jak ludzie zdecydowali się uderzyć tej równowagi w projektowaniu C.

Jak wykazano w kilku innych odpowiedziach, po usunięciu szczególnych okoliczności, w których C został opracowany, w warunkach różnych języków programowania zastosowano wszelkiego rodzaju alternatywne formy składni. Tak więc nawiasy naprawdę sprowadzają się do decyzji projektowej podjętej przez kilka osób pod pewnymi ograniczeniami w pewnym momencie historii.

David K.
źródło
Nie jestem pewien, czy można powiedzieć, że C ++ został zaprojektowany w taki sposób, aby był „w celu nakłonienia tych programistów do używania nowego języka”. Pamiętasz C z zajęciami ?
CVn
@ MichaelKjörling Trzeba przyznać, że programiści Java byli o wiele bardziej wyraźni w kwestii „wooing”. Zauważ jednak, że powiązany artykuł przytacza, jako jeden z powodów, dla których Stroustrup wybrał C jako podstawę swojego języka, że ​​C był szeroko stosowany. Jednym ze sposobów, dzięki którym było to motywacją do pozostania blisko C, było to, że istniejący kod można łatwo dostosować (jak już powiedziałem) - ale również istniejący koder można łatwo dostosować.
David K
@ MichaelKjörling Przypuszczam, że oryginalne sformułowanie mojej odpowiedzi sugerowało, że „wooing” było większym czynnikiem w projektowaniu języka niż było w rzeczywistości. Zredagowałem odpowiedź, aby wyjaśnić, że była to tylko jedna rzecz, która została uwzględniona w projekcie języka.
David K
3

Wielu tutaj twierdzi, że bez nawiasów składnia byłaby dwuznaczna i sugerowałaby po cichu, że byłaby to jakaś zła, a nawet niemożliwa sytuacja.

W rzeczywistości języki mają wiele sposobów radzenia sobie z dwuznacznościami. Pierwszeństwo operatorów jest tylko jednym z przykładów tego tematu.

Nie, dwuznaczność nie jest przyczyną nawiasów. Wydaje mi się, że można po prostu stworzyć wersję C, która nie wymaga nawiasów wokół warunku (czyniąc je opcjonalnymi) i która nadal tworzy poprawny kod we wszystkich przypadkach. Przykład if a ++ b;może być interpretowany jako równoważny if (a) ++b;lub if (a++) b;, cokolwiek wydaje się bardziej odpowiedni.

Pytanie, dlaczego Dennis Ritchie postanowił uczynić () obowiązkowym (a więc wymyślając ten mem dla wielu języków pochodnych) jest raczej językowe. Myślę, że ojcem tej myśli było stwierdzenie, że warunek jest raczej wyrażeniem niż rozkazem .

W rzeczywistości C został zaprojektowany do analizowania przy użyciu parsera jednoprzebiegowego. Zastosowanie składni z obowiązkowymi nawiasami wokół warunku obsługuje ten aspekt.

Alfe
źródło
Widzę zdanie negatywne na mojej odpowiedzi. Prosimy o wyjaśnienie w komentarzu tego, co ci się nie podobało. Może wtedy mogę to poprawić.
Alfe,
0

Nawiasy wokół ifwarunków nie są wymagane w Fortran, Cobol, PL / 1, Algol, Algo-68, Pascal, Modula, XPL, PL / M, MPL, ... lub w innym języku ze thensłowem kluczowym. thensłuży do rozgraniczenia conditionnastępujących elementów statement.

Nawias zamykający w C itp. Działa jako then, a otwierający jest formalnie redundantny.

Powyższe uwagi dotyczą tradycyjnie analizowanych języków.

użytkownik207421
źródło
Fortran nie wymagają nawiasów we wszystkich wersjach, jeśli jej w tym jeden strukturalnej.
Netch