int main() {
int y;
int x{ y = 5 };
//x is 5
}
Jak to możliwe, skoro y = 5 nie jest wyrażeniem obliczalnym?
Ponadto, dlaczego kompilator lub IDE nie narzeka na to, że main () nie zwraca int?
c++
initialization
declaration
assignment-operator
counterstriker0
źródło
źródło
y = 5
jest wyrażeniem i ma wartość5
. Jak myślisz, dlaczego tak nie jest?return
zmain
patrz na to pytanie .y = 5
daje 5 tutaj. Możliwość zwrócenia czegoś przez operatorów przypisań jest rzeczywiście dziwną cechą C / C ++.Odpowiedzi:
Zacznę od twojego ostatniego pytania
Zgodnie ze standardem C ++ (główna funkcja 6.6.1)
I w odniesieniu do tego pytania
Ze standardu C ++ (operatory przypisania i przypisania złożonego 8.18)
Sp to oświadczenie
można równo podzielić na dwie instrukcje
Ponadto w C ++ możesz nawet odwołać się do zmiennej y w następujący sposób
Oto program demonstracyjny
Jego wydajność to
Możesz tę deklarację
przepisz również jak
Należy jednak wziąć pod uwagę, że istnieje różnica między nimi (wyglądającymi podobnie jak powyższe deklaracje) dwie deklaracje.
i
W pierwszej deklaracji zmienna
x
ma typint
. W drugiej deklaracji zmiennax
ma typstd::initializer_list<int>
.Aby różnica była bardziej widoczna, zobacz, w jaki sposób generowane są wartości obiektów.
Wyjście programu to
źródło
Jest to przypisanie, a przypisania dają wartości, tzn. „Lewy operand niekwalifikowany cv”, patrz [expr.ass / 3] . Stąd też
y = 5
powodujey
, która jest5
, co jest wykorzystywane do inicjacjix
.W odniesieniu do drugiego pytania zobacz cppreference na main (lub [basic.start.main / 5] ):
Dlatego kompilator lub IDE ostrzegający o brakującym
return
wyrażeniu na końcumain
byłoby po prostu błędne. Trzeba przyznać, że fakt, że zawsze powinieneśreturn
sprzeciwić się wykonywaniuvoid
funkcji niemain
jest… no cóż, chyba z powodów historycznych.źródło
return
. -pedanticTe
operator=()
wyniki w wartości, która jest wartość przypisana do zmiennej. Z tego powodu możliwe jest połączenie zadań w następujący sposób:źródło
Jeśli spojrzysz na dokumentację dotyczącą cppreferencji , zobaczysz, że
operator=()
zwraca odwołanie do obiektu, który został przypisany. Dlatego przypisanie może być użyte jako wyrażenie zwracające przypisany obiekt.To normalne zadanie z nawiasami klamrowymi.
źródło