web-dev-qa-db-ja.com

Cコードのブロックを中括弧で囲むのはなぜですか?

私はいくつかのCコードを見ていますが、制御構造を持たないコードブロックを囲む中括弧でいっぱいになっていることに気付きました。見てみましょう:

//do some stuff . . .
fprintf(stderr, "%.2f sec\n", (float)(clock() - t) / CLOCKS_PER_SEC);
{
    //a block! why not?
    char *tmp_argv[3];
    tmp_argv[0] = argv[0]; tmp_argv[1] = str; tmp_argv[2] = prefix;
    t = clock();
    fprintf(stderr, "[bwa_index] Convert nucleotide PAC to color PAC... ");
    bwa_pac2cspac(3, tmp_argv);
    fprintf(stderr, "%.2f sec\n", (float)(clock() - t) / CLOCKS_PER_SEC);
}

なぜこのようなブロックをコードに挿入するのですか?それはそれらでいっぱいです。何らかのパフォーマンス上の利点はありますか?神秘的なCの何か?なぜ???

edit:このコードは [〜#〜] bwa [〜#〜] からのもので、小さな配列を整列させるバイオインフォマティクスプログラムです。 Burrows-Wheeler変換 を使用して大規模なリファレンスに変換します。このコード例は、アプリケーションの機能には特に関係ありません。

61
jergason

レガシーコードには宣言を行うために{}が必要でした

C89では、int i;どこでも;宣言はブロックの先頭でのみ有効でした。

そう:

a = 1;
int i; /* error */
i = 2;

...有効ではありませんでしたが、

a = 1
if (e) {
  int i;

...普通のブロックのように、大丈夫でした。

結果のスタイルは、宣言が有効になった後も継続しました(C99)block-item(s)、一部は慣性によるもの、一部は後方への移植性のため、また新しい宣言のスコープを確立することが理にかなっているためです.

90
DigitalRoss

変数をスコープします。例えば。変数tmp_argvは中括弧の間でのみ有効です。

38
jldupont

私が最近発見したこの別のユースケースは、オープン/クローズのセマンティクスがあり、「内部」コードを明確にマークしたい場合です。

f = fopen('file');
{
    // do stuff
}
fclose(f);

これは、オブジェクトを閉じたり解放したりすることを思い出させるためにうまく機能し、コードをいくらかきれいにします。

7
Mike Weller

ブロックとは、変数の有効期間とコンパイラーに対する可視性を決定するスコープです。そのため、ブロック内で作成された変数は、制御がブロックを終了すると消えます。

これらの変数がコンストラクタとデストラクタを持つクラスのインスタンスである場合、非常に便利です。

ただし、この例ではあまり利点はありません。

7
Paul Lalonde

スコープを作成しています。スタックオブジェクトは、スコープ外になると破棄されます。何らかのタイピングを行っているように見えます。つまり、各ブロックは時間を計りたいと思っているものです。ただし、スコープタイマーオブジェクトは表示されないので、意味がありません。

6
i_am_jorf

ブロック内で宣言する変数は、そのブロックに対してローカルです。このようにして、tmp_argvこのコードと競合することなく、コードの他の場所(下記)で。

5
pgb

私は時々これらの場合にブロックを使用します:-変数をローカライズするために-または読みやすくするために...

1
ltgbau

それだけですか?プログラマーは、コードのどこかでtmp_argvを使用している可能性があります。 tmp_argv{の間の}は中括弧の外側とは別なので、他の理由は考えられません。

1
Jacob