86

多くの言語では、代入は条件付きで合法です。この背後にある理由がわかりませんでした。なぜあなたは書くのですか:

if (var1 = var2) {
  ...
}

それ以外の:

var1 = var2;
if (var1) {
  ...
}
4

12 に答える 12

122

if ステートメントよりもループに役立ちます。

while( var = GetNext() )
{
  ...do something with var 
}

そうでなければ書かなければならないもの

var = GetNext();
while( var )
{
 ...do something
 var = GetNext();
}
于 2008-09-30T05:32:39.460 に答える
35

エラー検出などを伴うことが多い一連のアクションで最も役立つと思います。

if ((rc = first_check(arg1, arg2)) != 0)
{
    report error based on rc
}
else if ((rc = second_check(arg2, arg3)) != 0)
{
    report error based on new rc
}
else if ((rc = third_check(arg3, arg4)) != 0)
{
    report error based on new rc
}
else
{
    do what you really wanted to do
}

別の方法 (条件で代入を使用しない) は次のとおりです。

rc = first_check(arg1, arg2);
if (rc != 0)
{
    report error based on rc
}
else
{
    rc = second_check(arg2, arg3);
    if (rc != 0)
    {
        report error based on new rc
    }
    else
    {
        rc = third_check(arg3, arg4);
        if (rc != 0)
        {
            report error based on new rc
        }
        else
        {
            do what you really wanted to do
        }
    }
}

エラー チェックが長引くと、代替案はページの RHS からはみ出す可能性がありますが、条件付き割り当てバージョンはそうしません。

エラー チェックは、単なるチェックではなく、もちろん'アクション' である可能性もありfirst_action()ます。つまり、関数が管理しているプロセスのステップをチェックすることができます。(ほとんどの場合、私が使用するコードでは、関数は事前条件チェックの行に沿っているか、関数が機能するために必要なメモリ割り当てに沿っているか、または同様の行に沿っています)。second_action()third_action()

于 2008-09-30T05:59:00.410 に答える
31

関数を呼び出す場合は、より便利です。

if (n = foo())
{
    /* foo returned a non-zero value, do something with the return value */
} else {
    /* foo returned zero, do something else */
}

確かに、 n = foo(); を置くことができます。別のステートメントで then if (n) ですが、上記はかなり読みやすいイディオムだと思います。

于 2008-09-30T05:27:16.773 に答える
24

処理するデータまたはエラー (または完了) を示すフラグのいずれかを返す関数を呼び出す場合に役立ちます。

何かのようなもの:

while ((c = getchar()) != EOF) {
    // process the character
}

// end of file reached...

個人的にはあまり好きではないイディオムですが、別の言い方の方が醜い場合もあります。

于 2008-09-30T05:26:51.207 に答える
15

GCC は、意図せずに割り当てを真の値として使用しようとした場合に (-Wall を使用して) 検出するのに役立ちます。

if ((n = foo())) {
   ...
}

つまり、追加の括弧を使用して、これが本当に必要なものであることを示します。

于 2008-09-30T05:32:34.250 に答える
9

このイディオムは、ステートメントwhileの代わりにループを作成する場合により便利です。ifステートメントについては、if説明どおりに分割できます。しかし、この構造がなければ、次のことを繰り返す必要があります。

c = getchar();
while (c != EOF) {
    // ...
    c = getchar();
}

またはループ半構造を使用します。

while (true) {
    c = getchar();
    if (c == EOF) break;
    // ...
}

私は通常、ループと半分の形式を好みます。

于 2008-09-30T05:32:33.767 に答える
4

簡単な答えは、式指向プログラミング言語はより簡潔なコードを可能にするということです。コマンドをクエリから分離する必要はありません。

于 2008-09-30T06:36:29.493 に答える
3

たとえば、PHP では、SQL データベースの結果をループするのに便利です。

while ($row = mysql_fetch_assoc($result)) {
    // Display row
}

これは、次のものよりもはるかに優れています。

$row = mysql_fetch_assoc($result);
while ($row) {
    // Display row
    $row = mysql_fetch_assoc($result);
}
于 2008-09-30T05:33:00.067 に答える
2

もう 1 つの利点は、gdb の使用中に得られます。次のコードでは、シングル ステップの場合、エラー コードは不明です。

while (checkstatus() != -1) {
    // process
}

それよりも

while (true) {
    int error = checkstatus();
    if (error != -1)
        // process
    else
        //fail
}

これで、シングル ステップ中に、checkstatus() から返されたエラー コードを知ることができます。

于 2013-10-10T06:39:30.620 に答える
0

boost::optionalオプションを返す関数(またはstd::optionalC ++ 17)で非常に便利だと思います:

std::optional<int> maybe_int(); // function maybe returns an int

if (auto i = maybe_int()) {
    use_int(*i);
}

これにより、変数のスコープが縮小され、コードがよりコンパクトになり、読みやすさが妨げられなくなります (私は見つけました)。

ポインタと同じ:

int* ptr_int();

if (int* i = ptr_int()) {
    use_int(*i);
}
于 2019-11-22T18:39:54.673 に答える
0

今日はArduino(C言語)でプログラミングしながら使ってみました。

場合

送信機と受信機があります。送信機は、受信されるまでデータを送信したいと考えています。プロセスが完了したときにフラグを設定したい。

while (!(newtork_joined = transmitter.send(data))) {
Serial.println("Not Joined");
}

ここ:

  • "transmitter.send" - 送信が成功すると true を返します
  • 「newtork_joined」 - 成功したときに設定したフラグです

結果

  1. 送信に失敗した場合、フラグは設定されず、ループが true の間、実行され続けます。

  2. 成功すると、フラグが設定され、ループが false の間、終了します

美しくないですか?

于 2021-05-27T11:48:52.337 に答える
-4

その理由は:

  1. パフォーマンスの向上 (時々)

  2. 少ないコード (常に)

例を見てみましょう: メソッドがあり、メソッドsomeMethod()if戻り値が であるかどうかを確認したい条件がありますnull。そうでない場合は、戻り値を再度使用します。

If(null != someMethod()){
    String s = someMethod();
    ......
    //Use s
}

同じメソッドを 2 回呼び出すため、パフォーマンスが低下します。代わりに次を使用します。

String s;
If(null != (s = someMethod())) {
    ......
    //Use s
}
于 2016-11-18T12:24:40.923 に答える