2016-04-23 9 views
2

私は0から10までの値を返す関数MyFunctionを持っているとしましょう。0は成功を示し、失敗ではないことを示します。私は私が悪いだから(再定義を発生させずにローカルである変数int型の電子を持つようにしたい場合はif条件の中で変数を宣言するには?

int e = MyFunction(); 
if (e != 0) { MessageBox(e); } 

:私は値をメッセージボックスを表示したい場合は、ゼロ以外だ場合にのみ、私は次のことを行う必要があり命名か何か)私は、中括弧内全体を囲み、そのような変数分離することができます:

int e; 
{ int e = MyFunction(); if (e != 0) { MessageBox(e); } } 

そうのような代わりに、単一のif文の中にこれを圧縮することは可能です:

if (int e = MyFunction() != 0) { MessageBox(e); } //obviously does not work as intended 

私は文が本当にこのように動作しないのは知っていますが、とにかくC++の魔法を使ってもそれを行うことは可能でしょうか?それは皆さんにとっては些細なことかもしれませんが、私は本当にこれをしたいと思っています。私は検索もしましたが、サイコロはありませんでした。ありがとう!コードの

+3

_... C++ magic ... _ユニコーンにお尋ねください。 –

+0

名前をつけたり何かに間違っているので... :) – erip

+0

エラー管理に例外を使用するとどうなりますか? – simpel01

答えて

6

あなたはこのようにそれを行うことができます。

if(int e = MyFunction()) 
{ 
    MessageBox(e); 
} 

これはintが自然boolに変換されるためeがどのゼロ以外値(またはそれがtrueブール値に変換している場合)であるときにif()が成功した作品。

この利点は、周囲のスコープにエラー戻り値を捨てないことです。関数呼び出しをテストから分離することは、一部のコーダーにとってはすぐには明らかではないかもしれません。

+0

この種の暗黙の真理状態は、特にC++では不明瞭/悪い形式であると考えている人がいます。私は必ずしもその一つではない。 –

+0

@LightnessRacesinOrbit私はこの問題について完全には決めていません。このスタイルを容易にするオプションの値を持つ状態戻り型の少なくとも1つの提案があります。私はそれが周囲の範囲をクリアしているという事実は価値があり、一般的なリターンコード変数と変数リターからのバグを減らすのに役立つと思います。 – Galik

6

あなたの第二のスニペットはそれを行うには、正しい/適切/最高/明確な/最も簡単な方法です。

あまりにも賢いようにしないでください。

0

ないあなたが望んでいた正確に何が、原因が唯一のレコード外観である場合は、代わりにifforを使用することができます。

for(int e = MyFunction(); e!=0; e=0) MessageBox(e); 

をしかし、私はに、通常のクリアコードを置き換えるために、任意の理由があるかわかりませんこのようなステートメント。誰もあなたにそのようなソリューションをお勧めしません。

関連する問題