web-dev-qa-db-ja.com

結果の周りの括弧はreturnステートメントで重要ですか?

関数内のこれら2つのステートメントに違いはありますか?

bool returnValue = true;
// Code that does something
return(returnValue);

この?

bool returnValue = true;
// Code
return returnValue;

前者はreturnValueを括弧で囲んでいます。

74
Jose Villalta

C++ 14の時点では、多くの場合そうです。

C++ 14は、戻り値の周りの括弧がセマンティクスを変更する可能性があるフリンジケースを追加します。このコードスニペットは、宣言されている2つの関数を示しています。唯一の違いは、戻り値を囲む括弧です。

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

最初のfunc1intを返し、2番目のfunc1int&を返します。 セマンティクスの違いは、周囲の括弧に直接関連しています。

最新形式のauto指定子はC++ 11で導入されました。 C++言語仕様 では、次のように記述されています。

宣言されている変数の型が、その初期化子から自動的に推定されることを指定します。関数の場合、戻りの型が末尾の戻りの型であるか、またはその戻りステートメントから推定されることを指定します(C++ 14以降)

同様に、C++ 11は C++言語仕様 で説明されているdecltype指定子を導入しました:

エンティティーの宣言されたタイプを検査するか、式の戻りタイプを照会します。

[をちょきちょきと切る]

  1. 引数が括弧なしのオブジェクト/関数の名前、またはメンバーアクセス式(object.memberまたはpointer-> member)の場合、decltypeはこの式で指定されたエンティティの宣言された型を指定します。

  2. 引数がタイプTの他の式である場合、

    a)式の値カテゴリがxvalueの場合、decltypeはT &&を指定します

    b)式の値カテゴリが左辺値の場合、decltypeはT&を指定します

    c)それ以外の場合、decltypeはTを指定します

[をちょきちょきと切る]

オブジェクトの名前が括弧で囲まれている場合、それは左辺値式になることに注意してください。したがって、decltype(arg)とdecltype((arg))は多くの場合、異なるタイプです

C++ 14では、関数の戻り値の型にdecltype(auto)を使用する機能が許可されていました。元の例では、括弧による意味の違いが関係しています。元の例に戻る:

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)を使用すると、関数の末尾の戻り型を、returnステートメントのエンティティ/式から推定できます。最初のバージョンではreturn var1;はタイプdecltype(var1)(上記のルール1によるint戻りタイプ)を返すのと実質的に同じで、2番目のケースではreturn (var1);です。実質的にdecltype((var1))と同じです(ルール2bのint &戻り値型)。

括弧は、戻り値の型をintではなくint&にするため、セマンティクスが変更されます。 物語の教訓-「戻り値の型のすべての括弧が同じように作成されるわけではありません」

101
Michael Petch

違いはありません。

括弧を使用する理由の1つは、返す前に式を評価したい場合ですが、この例では理由がありません。見る:

戻り値を囲む括弧

さらなる議論のために。

6
Karl Rosaen

私の知る限り、違いはありません。

C++では、式の形式はexprまたは(expr)。したがって、後者はよりタイピングの多い式です。詳細については、 文法 を参照してください(「式」を探します)。

4
David Weiser

上の例の括弧は不必要です。それらは事実上無視されます。

それは次のようなものと同じです...

int x = (5);

ここでの括弧も無視されます。

4
James

いいえ、コードに違いはありません。

3
Elalfer

私はbooがタイプミスだと思います、そしてあなたは違いがあるかどうか尋ねています

return expr;

そして

return(expr);

答えはノーだ。

3
aschepler

いいえ、違いはありません。ただし、式を読みやすく、明確にするためにかっこを含めることができます。

2
sanchit.h

コンパイラーを酷使してスローダウンしています!

括弧が存在すると、前処理フェーズが遅くなるだけでなく、より複雑な抽象構文ツリーも生成されます。つまり、より多くのメモリ、より多くの計算が必要になります。


意味の観点から?それらはまったく同じです。括弧があるかどうかに関係なく、returnステートメントは式を完全に評価してから返します。

1
Matthieu M.

変わりはない!!

複雑な式がある場合、人々は括弧を使用します。

ところでreturnは関数ではなくステートメントです。

1
Prasoon Saurav

それらは同一です。括弧の構文をよく目にします。そして、それを使う人にいつも尋ねます:why?そして、なぜそれを使用するのか誰も答えることができません。

端的に言えば、関数のようなマクロと関数の違いをよく理解していない、またはCでの演算子の優先順位や評価規則の順序について混乱している人は、戻り式の括弧を使用します。コーディングはありません。括弧を使用するとスタイルにメリットがあります。

したがって

return value;

より正しいです

return (value)

後者はあなたが何をしているのかよくわからないことを示唆しているので:)

0
Lundin