Czy istnieje różnica między tymi dwoma instrukcjami wewnątrz funkcji?
bool returnValue = true;
// Code that does something
return(returnValue);
i to?
bool returnValue = true;
// Code
return returnValue;
Pierwsza z nich ma nawiasy wokół returnValue
.
c++
/c
. Dobrze byłoby bardziej szczegółowo określić definicję języka, ale 9 lat później nie wiem, jak to naprawić.C
istnieje zduplikowany stackoverflow.com/questions/161879/ ...Odpowiedzi:
Począwszy od C ++ 14, często tak jest.
C ++ 14 dodaje przypadek fringe, w którym nawiasy wokół zwracanej wartości mogą zmienić semantykę. Ten fragment kodu przedstawia deklarowane dwie funkcje. Jedyną różnicą są nawiasy wokół zwracanej wartości.
int var1 = 42; decltype(auto) func1() { return var1; } // return type is int, same as decltype(var1) decltype(auto) func1() { return(var1); } // return type is int&, same as decltype((var1))
W pierwszym
func1
zwraca an,int
aw drugimfunc1
zwraca anint&
. Różnica w semantyce jest bezpośrednio związana z otaczającymi nawiasami .Specyfikator
auto
w swojej najnowszej postaci został wprowadzony w C ++ 11. W specyfikacji języka C ++ jest to opisane jako:C ++ 11 również wprowadził
decltype
specyfikator, który jest opisany w specyfikacji języka C ++ :W C ++ 14 można
decltype(auto)
było używać zwracanych typów funkcji. W oryginalnych przykładach pojawia się różnica semantyczna z nawiasami. Wracając do oryginalnych przykładów:int var1 = 42; decltype(auto) func1() { return var1; } // return type is int, same as decltype(var1) decltype(auto) func1() { return(var1); } // return type is int&, same as decltype((var1))
decltype(auto)
umożliwia wywodzenie końcowego typu zwracanego w funkcji z jednostki / wyrażenia w instrukcji return. W pierwszej wersjireturn var1;
jest to w praktyce to samo, co zwracanie typudecltype(var1)
( typint
zwracany przez regułę 1 powyżej), aw drugim przypadkureturn (var1);
jest faktycznie to samo, codecltype((var1))
(int &
typ zwracany przez regułę 2b).Nawiasy tworzą zwracany typ
int&
zamiastint
, co powoduje zmianę semantyki. Morał z tej historii - „Nie wszystkie nawiasy w zwracanym typie są sobie równe”źródło
return (x);
jest to równoważnereturn &x;
, ani nie powinno być możliwe, aby zwracał wartość x, ale z odniesieniem do typu x.auto
dość często. Czy nasza semantyka nigdy się nie zmienia, dopóki trzymamy się z dalekadecltype
? Obawiam się nieoczekiwanego zachowania, gdy przechodzimy do kolejnej wersji kompilatora, która zawiera następny program Visual Studio.Nie ma różnicy.
Jednym z powodów użycia nawiasów byłoby sprawdzenie wyrażenia przed zwróceniem, ale w Twoim przykładzie nie byłoby powodu. Widzieć:
Nawiasy otaczające zwracane wartości
do dalszej dyskusji.
źródło
return m * x + c
ireturn (m * x + c)
lubreturn ( (m * x) + c )
lub itd. - i nie wygląda to lepiej ani bardziej intuicyjnie, jeśli o mnie chodzi.Nawiasy w górnym przykładzie są zbędne; są skutecznie ignorowane.
To byłoby to samo, co coś takiego ...
int x = (5);
Tutaj również nawiasy są ignorowane.
źródło
AFAIK, nic nie jest inne.
W C ++ wyrażenia mogą mieć postać:
expr
lub(expr)
. Tak więc to drugie jest wyrażeniem wymagającym więcej pisania. Aby dowiedzieć się więcej na ten temat, zapoznaj się z gramatyką (poszukaj „wyrażenia”).źródło
Nie, nie ma różnicy w Twoim kodzie.
źródło
Zakładam, że
boo
to literówka, a Ty pytasz, czy jest różnica międzyreturn expr;
i
return(expr);
Odpowiedź brzmi nie.
źródło
Bez różnicy!!
Ludzie używają nawiasów, jeśli w grę wchodzi złożone wyrażenie.
BTW
return
to instrukcja, a nie funkcja.źródło
Nie, nie ma między nimi różnicy, chociaż możesz dodać nawiasy, jeśli dzięki temu wyrażenie będzie łatwe do odczytania i zrozumiałe.
źródło
return
jest chciwym operatorem, któryreturn m * x + c
może wrócićm
i odrzucić resztę, czy co?Znacząco spowalniasz kompilator!
Obecność nawiasów nie tylko spowalnia fazę przetwarzania wstępnego, ale także generuje bardziej skomplikowane drzewo składni abstrakcyjnych: więcej pamięci, więcej obliczeń.
Z semantycznego punktu widzenia? Są dokładnie identyczne. Niezależnie od tego, czy istnieją nawiasy, czy nie,
return
instrukcja w pełni oceni wyrażenie przed zwróceniem go.źródło
Są identyczne. Dość często widzę składnię nawiasów i zawsze pytam tych, którzy jej używają: dlaczego ? I nikt nie może odpowiedzieć, dlaczego go używają.
Podsumowując bez ogródek, nawiasy wokół zwracających wyrażeń są używane przez osoby, które nie do końca rozumieją różnicę między makrami i funkcjami podobnymi do funkcji lub są zdezorientowane co do pierwszeństwa operatorów lub kolejności reguł oceny w C. Nie ma kodowania. style korzystają z używania nawiasów.
A zatem
return value;
jest bardziej poprawne niż
return (value)
bo to drugie sugeruje, że nie bardzo wiesz, co robisz :)
źródło
W twoim przypadku oba są takie same.
źródło
a
jest5
następniereturn a++;
ireturn (a++);
(które są takie same) wierszową5