Ta nienormatywna uwaga w normie ma na celu zmotywowanie pojęcia wyrażenia, ale nie jest faktyczną definicją. Definicja wyrażenia jest podana w gramatyce języka podanej w pozostałej części zdania 5. Wyrażenia zbudowane są z określonych terminali, takich jak literały, nazwy zmiennych i nazwy funkcji, które są łączone za pomocą operatorów takich jak arytmetyczne. i operatory relacyjne.
Deklaracje i wyrażenia są odrębnymi jednostkami składniowymi, więc deklaracja znajdująca się w programie C++ nigdy nie jest wyrażeniem, a na odwrót: . Różnica jest dość łatwa do zauważenia na pierwszy rzut oka: jeśli deklaruje coś, jest to deklaracja.
1; // expression statement
int i = 1; // declaration statement that declares `i`
A(i, 42); // expression statement that creates an A object
A a(i); // declaration statement that declares an A object (named a)
Oświadczenie może ocenić wyrażeń ale deklaracja nie jest wyrazem. Słusznie zauważasz, że deklaracja obiektu typu klasy może spowodować wywołanie konstruktora. Wciąż jest składniowo deklaracją, a nie wyrażeniem.
Istnieje jednak inny sens, w którym deklaracja jest wyrażeniem o wartości. Mianowicie, zasady dotyczące sekwencjonowania ocen w obrębie wyrażeń mają również zastosowanie do deklaracji. Na przykład istnieje zasada, że efekt uboczny przyrostu postfiksu na int
ma miejsce w pewnym momencie przed zakończeniem pełnego wyrażenia.
f(i++) + g(); // i may be incremented before or after g() is called...
h(); // but definitely before h() is called.
Dla celów takich zasad deklaracja i inicjalizacja pojedynczej zmiennej uważane są również za pełne wyrażenie. W przypadku zmiennej typu klasy wywołanie konstruktora jest częścią tego wyrażenia.
int i = 1; // this declaration evaluates a full-expression
// whose effect is to initialize `i` to 1
int j = f(i++) + g(), k = h(); // two separate full-expressions;
// i is incremented before h() is called
Podczas czytania normy należy wziąć pod uwagę kontekst, aby określić, co oznacza "wyrażenie".
Możliwy duplikat [co to jest wyrażenie i wyrażenie w wyrażeniu C++?] (Http: // stackoverflow.com/questions/7479946/whats-an-expression-and-expression-statement-in-c) –
Prosta zasada mówi, że wyrażenia nie mają średników. Dodanie średnika zamienia je w instrukcje. Wyrażenie jest także czymś, co można zawinąć w nawiasy i użyć wewnątrz innego wyrażenia. Nie możesz napisać 'x = (int i = 1;)'. –
Sprawdź gramatykę, wypakowałem ją tutaj: https://github.com/o11c/chintzy/blob/master-py/chintzy/_std/cxx14.py#L559 – o11c