1

コードにバグが見つかりました (if ステートメントには "=" の代わりに "==" が必要でした)。いくつか質問があります。

コード例:

int i = 5;
if (i = MyFunction())  // MyFunction() returns an int; this is where bug was made
{
  // call A()
}
else
{
  // call B()
}

私が収集したものから、常に A() を呼び出す必要があります。
1. 私の仮定は正しいですか?
2. これは、すべて/ほとんどのコンパイラに当てはまりますか (例外はありますか)?

4

6 に答える 6

8
  1. A()いいえ、割り当てが真、つまり非ゼロと見なされる場合にのみ呼び出されます。
  2. はい、これが標準です。混乱のリスクが大きいため、コードの記述方法としてはあまり適していません。

リスクを回避するために、左に定数を書き込んで比較を反転する人もいます。

if( 12 == x )

もちろん、これは実際には割り当てであるため、これはあなたの場合には機能しませんでした。ほとんどのコンパイラは、このコードが検出されたときに警告を表示できます。これは、バグの原因となることが多いためです。

于 2012-07-06T09:28:35.403 に答える
6

MyFunction()ゼロ ( ) を返す場合0、B() を呼び出します。それ以外の場合は、A() を呼び出します。代入式の値は、左辺に代入される値です。ifステートメントでは、 0 は false として扱われ、他のすべての値は true として扱われます。

多くのコンパイラは警告を発しますが、これは完全に正当なコードです。これが有効である理由は、C および同様の言語では、代入が (ステートメントではなく) 式であるためです。

i戻り値を代入してテストするつもりならif ((i = MyFunction()))、 ;と書く必要があります。余分な括弧は、割り当てが意図されていることをコンパイラ (およびリーダー) に通知します。

代わりに、の値に対してテストする場合は、 ;iと書く必要があります。if (MyFunction() == i)関数呼び出しを左側に置くことで、二重の等号を見逃すとコードがコンパイルに失敗することを保証します (MyFunction() = iは通常有効な式ではありません)。

于 2012-07-06T09:28:31.740 に答える
4

このステートメントは割り当てです。

i = MyFunction()

ifステートメントは事実上iの値をチェックしています。MyFunction()が0を返す場合、iには0が割り当てられ、次と同等になります。

if(0)

これはfalseと評価され、この場合はA()は呼び出されません。

于 2012-07-06T09:28:44.797 に答える
3

あなたの仮定は正しくありません。

-conditionの式は、if他の式と同じように評価されます。この場合、の結果(i = MyFunction())はの戻り値ですMyFunction()

于 2012-07-06T09:28:53.170 に答える
3

A関数の戻り値がゼロ以外の場合は、真の分岐 (つまり、 call ) を取ります。ゼロは false として扱われるため、MyFunction()ゼロを返す場合は代わりに呼び出しBます。

実際には、はい、これはほとんど/すべてのコンパイラで正しいです。0=false は単なる慣例だと思います。C99以降で正式化されたとしても驚かないでしょうが、適切なセクションを参照するためのコピーが手元にありません.

于 2012-07-06T09:27:39.600 に答える
2

あなたのコードは評価します

  (i = MyFunction())

MyFunction()ゼロ以外の値を返す場合、式はtrueと評価され、を呼び出しますA()。さもないとB()

于 2012-07-06T09:30:10.227 に答える