2011-07-28 3 views
7

は、私はいくつかのレガシーCコードで探していますし、混乱してしまった場合、それはのようなものです:入れ条件のチェックと1で変数代入文で

UINT A, B = 1; 
if((A = B) == 1){ 
    return(TRUE); 
} else { 
    return(FALSE); 
} 

我々はすべて我々があれば行う場合は、コンパイラの警告があるだろう知っています(A = B)が、ここでは 'if'がAと1を照合しているように見えますが、正しいですか?

答えて

10

最初A1に評価この割り当ての結果は、1に等しい場合、それはBA = BAの値を割り当て、それをチェックします。

技術的にはあなたは正しい:A1に対してチェックしています。読み、物事を簡単にするために

、コードは同等です:むしろ

UINT A, B = 1; 
A = B; 
if(A == 1){ 
    return(TRUE); 
} else { 
    return(FALSE); 
} 
+3

質問に書かれているようにコードを書くことができるからといって、あなたがすべきことではありません。あいまいさがないので、この答えに書かれているコードを常に好むべきです。 –

+6

オリジナルはどうやってあいまいですか?それはあなたにはっきりと分かりました。私には明らかです。 – baash05

5

、あなたのコードは常にABを割り当てており、それがさらにチェックされるかどうかBの値(したがってまたA )は1に等しい。あなたは、操作の結果を必要とするだけでなく、エラーをチェックする場合は、この程度は何も「レガシー」があります

、これは一般的にはかなり便利なイディオムです:

int result; 
if ((result = foo()) != -1) 
{ 
    printf("The result is: %i\n", result); 
} 
else 
{ 
    // panic 
} 
+0

ええ、foo()のチェックはfopen()のチェックと同じです。私がここに示したコードはちょっと混乱していて、私はちょっと混乱しました... – deddebme

0

は正しいです。値Aの値は1と比較されます。

このコードサンプルは、ちょうどと同等です:

if ((A = B), A == 1) 

は同じことを行います。あなたは1行でそれを維持したい場合は

return (TRUE); 
+0

正確には、割り当てが失敗する状況があるのだろうかと思います。 Kerrek SBのような関数の値。 – itisravi

+0

私は、このことを示すために質問が考案されていると思っています。Bは、通常は分かりません。 – baash05

0

if文を避けて、コードを読みやすくしています。

UINT A, B = 1; 
bool fResult = false; 

fResult = (A == B); 

return(fResult); 

また、等しくない(等しくない)条件を満たす必要がある場合は、この例を参照してください。

UINT A, B = 1; 
bool fResult = false; 

fResult = (A == B); 

if(fResult) 
{ 
    doThis(); 
} 
else 
{ 
    doThat(); 
} 

return(fResult); 
関連する問題