4

for ループを使用して条件ステートメントをチェックし、一連のデータに対してテストを実行するプログラムがあります。これらのほとんどは、if分岐する可能性のある 1 つのライナー ステートメントです。私の質問は、括弧付きの for ループは、範囲内と範囲外をどのように決定するのですか? 例えば:

私のプログラムの for ループ:

for( i =0; i < (sizeof(exact_roots) / sizeof(bn_comlplex)); i++){
        if(fabs(roots[k].re - exact_roots[i].re) < 0.00001 && fabs(roots[i].im - exact_roots[i].im) < 0.00001)
            rootmatch++;
}

この場合ブラケットは必要ですか?for ループは 3 行目を for ループの一部として扱いますか、それとも破棄してコンパイル エラーが発生しますか?

角かっこのない for ループの極端なケースはどうですか? ループはそれをどのように処理しますか?

for(i = 0; i < num; i++)
    if(something)
        ....
    else //is this still considered apart of the loop?
        ....
4

4 に答える 4

5
for(i = 0; i < num; i++)
    if(something)
        ....
    else //is this still considered apart of the loop?
        ....

はい、それはまだループの一部です。コンストラクト全体if () .... else ...が 1 つのステートメントです。

しかし、ブレースを使用すると、心配がなくなります。中括弧を使用すると、スコープが何であるかがすぐにわかります。

于 2012-12-21T18:42:33.493 に答える
4

次のステートメントのみがループの一部です。

あなたの例では、これif ... else ...;は1つのステートメントです。

于 2012-12-21T18:42:30.957 に答える
1

そして、非常に極端になる可能性があります。

for( i =0; i < (sizeof(exact_roots) / sizeof(bn_comlplex)); i++)
        if(fabs(roots[k].re - exact_roots[i].re) < 0.00001 && fabs(roots[i].im - exact_roots[i].im) < 0.00001)
            rootmatch++;
        else if (something)
           if (someother)
               do_stuff1();
           else if (third things)
                   do_stuff2()
                else
                   do_another();
        else
            do_failed();

もちろん、それをコードレビューすると、中かっこがなければ受け入れられません。なぜなら、どの if がどの中にあり、else がどこにあるのかすぐに混乱するからです。

そのため、ほとんどの場合、すべての if/while コンテンツを中括弧で囲みます。コードが読みやすくなり、読みやすくなれば保守も容易になります。

そしてもちろん、if ステートメントの 1 つに "printf("x = %d\n", x); を追加することを突然決定した場合に、余分な中括弧を追加すると役立ちます。目的の効果が得られ、コンパイラ エラーは発生しません。

[理にかなって] 中かっこが余っていてもまったく問題はありません。実行時間が増えることはなく、ソース コードで数バイト余分にかかるだけです。もちろん、Linux カーネルのメーリング リストにパッチを投稿しない限り、余分な中括弧が拒否されたコードの原因となります。

于 2012-12-21T19:15:18.087 に答える
0

中かっこを使用しない場合、for、if、else ステートメントの下で実行できるステートメントは 1 つだけです。中括弧を使用すると、ステートメントの複合グループを含めることができ、コードがはるかに読みやすくなります。

于 2012-12-21T18:51:25.470 に答える