2011-01-21 1 views
42

関数内にこれらの2つのステートメントの違いはありますか?return文では、結果のまわりのかっこは重要ですか?

bool returnValue = true; 

//Code that does something 

return(returnValue); 

とこれは?

bool returnValue = true; 

//Code 

return returnValue; 

前者は括弧がreturnValueである。

+10

いくつかのバッジを用意します。奇妙なことに、これらの質問*常に*最も多くの意見を得る。 –

+2

ようこそ、スタックオーバーフロー、ホセ。あなたの質問に編集した内容を書き留めてください。具体的には、コードの2つのブロックの間の変化について言及しています。これにより、読者はあなたのコードで[違いを見つけて](http://www.spotthedifference.com/)をプレイする必要がなくなります。また、単純なタイプミス( 'boo 'のような)の代わりに意図的な違いがあったときに人々が気付くのに役立ちます。 –

+0

おかげでロブ、あなたは正常に質問の精神を捉えました。 Essenceでは、コンパイラが何か特別なことをしたか(最初に式を評価しようとするようなこと)、あるいは無視しただけなのかどうか疑問に思っていました。 –

答えて

63

をやっているかわからないC++ 14のフリンジが追加されます戻り値のまわりのカッコがセマンティクスを変更する場合があります。このコードスニペットは、宣言されている2つの関数を示しています。唯一の違いは戻り値のまわりのかっこです。第func1戻りint Inおよびint&第1 func1リターンの

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

セマンティクスの違いは、周囲の括弧と直接関係しています。

最新の形式のauto指定子は、C++ 11で導入されました。

が宣言されている変数の型が自動的に 初期化子から推論されることを指定します。C++ Language Specでは、それは次のように記述されています。機能のために、戻り型が後続 戻り型であるか、またはその戻りステートメントから推定されることを指定(以降C++ 14)

同様にC++ 11に記載されているdecltype指定子を導入しますC++ Language Spec

エンティティの宣言された型を検査したり、式の戻り値の型を照会したりします。

[省略]

  1. 引数は、オブジェクト/関数のunparenthesised名のいずれかである、またはメンバアクセス式(object.member又はpointer->メンバー)である場合、decltypeが指定この式で指定されたエンティティの宣言された型。

  2. 引数は、型Tの任意の他の式である場合、

    式の値カテゴリがはxValueある場合A)、次いでdecltypeはT & &

    Bを指定)の値カテゴリなら発現は、その後decltypeがTに&

    Cを左辺値指定された)そうでない場合、decltypeはT

を指定します

[省略]

オブジェクトの名前を括弧に入れている場合、それは左辺値の式になることに注意してください、このようdecltype(引数)とdecltype((引数))は、しばしば、異なるタイプです。

C++では、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&とします。したがって、セマンティクスが変更されます。 ストーリーのモラル - 「返品タイプのカッコがすべて等しいとは限りません」

+0

括弧のついていないreturnステートメントはまだ左辺式です。そのシナリオでxvalueとして扱われている場合を除きます。かっこなしのリターンの価値カテゴリーについて説明できますか? –

+0

return文は、それに供給された式の読み込みを返します。つまり、その式に含まれている式からrvalueを取得して返します。私たちは左辺値を返すことはありません。いくつかのコンパイラにはここで与えられた説明と一致するバグがありますが、ここで与えられた理由で 'return(x);'が 'return&x;'や 'return&x;'それがxの値を返すことは可能であるべきですが、xへの型参照を返す必要があります。 –

11

編集した後、一方、他のboo ...


はい、一つは、boolを返します。

いいえ、彼らは同じです。

+1

それは私が思うタイプミスです。 –

+0

それを指摘してくれてありがとう。 –

+0

+1おかげで答えが返ってきました;) – BlackBear

0

違いはありません!

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

BTW returnは、関数ではありません。

+0

Cの初心者であれば、括弧を使います。 –

5

違いはありません。

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

Parenthesis surrounding return values

さらなる議論のために。

+2

複雑な表現であっても、これらの括弧は依然として異なる動作を引き起こしません。彼らは人間の読者に意味をより明白に(主観的に)与えるだけです。 – aschepler

+0

@Karl "括弧を使用する理由の1つは、返す前に式を評価したい場合です。"これの例を挙げることはできますか? –

+0

@ChrisMiddletonいいえ。なぜなら、このスレッドにあるようにクレームが無意味であるからです。 'return m * x + c'と' return(m * x + c) 'や' return((m * x)+ c) 'などの間には何の違いもありません。あなたが私に尋ねるならば、どちらかというとより直感的です。 –

2

いいえ、コードに違いはありません。私はboo仮定

2

はタイプミスで、あなたは答えはノーである

return expr; 

return(expr); 

に差があるかどうかを尋ねています。

3

AFAIK、何も違いはありません。

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

+0

David、リンクをありがとう。私はStroustrupのC++の本で文法を持っていますが、(私が推測するように)それはそれほど多くはありません。私はブラウザでブックマークしています。 –

3

上の例のかっこは余分です。それらは事実上無視される。

それは何かのように同じだろう...

int x = (5); 

ここで括弧も同様に無視されます。

+0

さて、技術的には無視されているわけではなく、式の値には何の効果もありません。 –

+0

@John:*効果的に無視されます。 :) – James

+3

+1 ...これは括弧が実際には冗長であることを示す唯一の答えであり、その使い方がちょっとばかりであることを示しています。 –

1

いいえ、2つの間に違いはありませんが、表現が読みやすくクリアされるようにするには、括弧を使用できます。

+0

...それは決してありません。それはなぜだろう?括弧書きのない表現について読むのは難しいですか?カッコを追加するだけで私は乱雑に見えます。より明白に見えるように、人々は 'リターン'は貪欲なオペレータであり、 'リターンm * x + c'は' m'を返して残りを捨てるかもしれないと思いますか? –

1

あなたはひどくコンパイラを遅くしています!

括弧が存在すると、前処理フェーズが遅くなるだけでなく、より複雑な抽象構文ツリーも生成されます。


意味論的な観点から?彼らはまったく同じです。かっこがあるかどうかにかかわらず、returnステートメントは、式を返す前に完全に評価します。

+4

私の考えは正確です。コンパイラに不必要な作業をさせることによって、無駄な混乱を解析することによって、それは正当な理由のない宇宙の熱の死に近づいています。 –

+0

ビットコインについてどう思いますか? –

1

これらは同じです。私はかっこの構文を頻繁に見て、私はいつもそれを使う人に尋ねます:なぜ?誰も彼らがそれを使う理由に答えることはできません。

関数のようなマクロと関数の違いをあまり把握していない人や、演算子の優先順位やCでの評価規則の順序について混乱している人が返す式の前後の丸括弧を使います。かっこを使用することによるコーディングスタイルのメリットはありません。後者は示唆しているため

したがって

return value; 

return (value) 

よりも正確である、あなたは非常にあなたが:)

-4

どちらも同じです。

+0

この回答は間違っています –

+0

M.Mあなたはあなたのコメントを説明してください? –

+0

'a'が' 5'なら 'return a ++;'と 'return(a ++);'(同じ)は両方とも '5'を返します。 –

関連する問題