2016-07-04 73 views
5

Standardowy język mówi:Czy C++ "deklaracja i inicjalizacja" oświadczenie, wyrażenie?

[Uwaga: Punkt 5 definiuje składnię, kolejność oceny oraz znaczenie z expressions.58 Wyrażenie to sekwencja operatorów i argumentów, które określa obliczeń. Wyrażenie może spowodować wartość i może powodować działania niepożądane. - nota końcowa]

E.g. Mam kod poniżej:

int i=1; 
A obj; 

Czy oba powyższe stwierdzenia są liczone jako "wyrażenie"?

Niektóre osoby na stackoverflow mówią "int i = 1;" nie jest wyrażeniem. To jest dla mnie dość dziwne.

(1) Inicjalizacja jest rodzajem "obliczenia", prawda? Więc powinno być uważane za "wyrażenie"?

(2) A obj; // wywołuje ctor. Ctor to rodzaj obliczeń, więc należy go uznać za "wyrażenie"?

+0

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) –

+0

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;)'. –

+0

Sprawdź gramatykę, wypakowałem ją tutaj: https://github.com/o11c/chintzy/blob/master-py/chintzy/_std/cxx14.py#L559 – o11c

Odpowiedz

6

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".

+0

Deklaracja nie jest wyrażeniem; niektóre "pełne wyrażenia" nie są wyrażeniami. Standard powinien używać "pełnej ekspresji" za każdym razem, gdy oznacza to pełne wyrażenie. –

+0

W rzeczywistości "A (i);" jest deklaracją. –

+0

@VaughnCato Mój zły, naprawi. – Brian