2012-10-23 25 views
17

Projektanci wybrali język, aby nawiasy klamrowe w następujących scenariuszach opcjonalnie:Dlaczego nawiasy klamrowe w funkcjach nie są opcjonalne w językach w stylu C?

if (a) 
    b 
while (a) 
    b 
... 

Dlaczego jest taka sama niedozwolone funkcje, jak to?

int add(int a, int b) 
    return a + b; 
+0

Może funkcja musi wiedzieć, co zawiera jej ciało. – Afaq

+0

Bez względu na funkcję lub konstrukcję warunkową/pętlową, długość i zawartość bryły muszą być znane podczas kompilacji, więc nawiasy klamrowe są po prostu sposobami porządkowania instrukcji. – sean

+2

odpowiedzi na to pytanie są prawie na pewno spekulatywne. jestem pewien, że to nie dotyczy tematu. –

Odpowiedz

24

Jestem pewien, że to zepsułoby gramatykę. Na przykład nie byłoby różnicy między tym pustym definicji funkcji ...

void empty() 
{ 
    ; 
} 

... i to oświadczenie funkcję:

void empty(); 
+3

Przybiłeś to. +1 –

2

Gdybym miał spekulować, powiedziałbym, że to dlatego, że funkcja zwykle zawiera więcej niż jedną instrukcję, natomiast if lub while często zawiera tylko jedno oświadczenie. Ponadto okazało się to dalekowzroczne, ponieważ w C++ pozwalając na ommission {} doprowadziłoby to do niejednoznaczności w funkcjach członkowskich. Na przykład:

struct s 
{ 
    void f() const int i; //does const refer to int i or the function? 
} 
+0

Co właściwie robi ta deklaracja? – djechlin

+0

@dłamlin: Powoduje błąd kompilatora, ponieważ {} nie są opcjonalne dla funkcji. Chodzi mi o to, że gdyby tak było, prowadziłoby to do niejednoznaczności w C++. Odpowiedź Roberta Coopera pokazuje, że spowodowałoby to niejasności również w C. –

4

Nie jestem pewien, czy "wybrali" to. Przeciwnie, zdolność ommit nawiasy klamrowe dla if, while, for itp. Wyłania się jako naturalna konsekwencja sposobu, w jaki określili gramatykę. Grammer zabrania dla funkcji prawdopodobnie ze względu na deklaracje funkcji w starym stylu.

3

Nie ma ustalonego słowa kluczowego związanego z definicjami funkcji. W przypadku jednego słowa kluczowego, które oznacza początek struktury kontroli logicznej, istnieje jedno takie słowo kluczowe.

Mimo że kontekst pozwala nam zrozumieć, w jaki sposób przychodzi int some_name (some_expression) some_other_expressions; jest to funkcja - w praktyce programistycznej (choć możliwe do wykonania w jednoznaczny sposób) potrzeba dużo wstecznego śledzenia, aby się upewnić, że 3-4-6 symboli w strumieniu tokenów nic się nie zmienia od deklaracji funkcji do czegoś innego.

Analizator składni języka programowania można sklasyfikować według jego podejścia do analizowania, albo pobiera bieżący token z listy tokenów i sprawdza, czy następny token potwierdza "jest to, jeśli" lub "jest to funkcja", lub trwa maksymalne tokeny wyprzedzające (2-3-6?) i potwierdza "może to być funkcja", "teraz, gdy widzę piąty token, to na pewno funkcja" lub używa wstecznego śledzenia ze zmiennym spojrzeniem, które idzie tak daleko w liście symboli, aby upewnić się, że konstrukt, który badamy, nie jest czymś innym.

1

Curly szelki nie są opcjonalne składniki „jeśli” i " if-else "instrukcje kontrolne. Produkcja gramatyczna dla wyrażenia kontrolnego "if" pozwala nadążać za wyrażeniem jednym nieterminalnym symbolem. Produkcja gramatyczna dla instrukcji kontrolnej "if-else" pozwala, aby jeden nieterminalny symbol podążał za wyrażeniem, a jeden nieterminalny symbol podążał za symbolem końcowym "else". Nazwa tego nieterminalnego symbolu to < oświadczenie >.

W kontekście struktur kontrolnych (a.k.a. instrukcje sterujące), nawiasy klamrowe należą do języka nieterminalowi symbol znany jako < onego oświadczenia > (czasem określane jako <bloku>). Nieterminalny symbol < oświadczenie złożone > pojawia się po prawej stronie wyrażenia gramatycznego, dlatego nawiasy klamrowe mogą być używane z instrukcjami kontrolnymi "if" i "if-else" (tj., złożone oświadczenie jest oświadczeniem).

<statement> ::= <if-then-statement> | 
       <if-then-else-statement> | 
       <for-statement> | 
       <do-while-statement> | 
       ... 
       <compound-statement> 

<statement-list> ::= <statement> | <statement-list> <statement> 

<if-then-statement> ::= "if" "(" <expression> ")" <statement> 

<if-then-else statement> ::= "if" "(" <expression> ")" <statement> 'else' <statement> 

<compound-statement> ::= "{" <statement-list> "}" 

pod względem funkcji oświadczenia, < związek-oświadczenie > nieterminalowi symbol jest ostatnim nieterminalowi symbol na prawej stronie z < funkcja-deklaracji > produkcji gramatycznej.

P.S. Wszystkie nieterminalne symbole są gramatycznymi produkcjami. Wszystkie produkcje gramatyczne ograniczają się do jednego lub więcej nieterminalnych i/lub końcowych symboli. Symbole terminala są słowami kluczowymi języka.

Powiązane problemy