66

私はいくつかの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のこと?なぜ???

編集:このコードは、BWAからのものである場合、 Burrows-Wheeler変換を使用して小さなシーケンスを大きな参照シーケンスに整列させるバイオインフォマティクスプログラムです。このコード例は、アプリケーションの機能には特に関係ありません。

4

9 に答える 9

95

宣言を行うには、従来のコードに { } が必要でした

int i;C89 では、どこでもできるわけではありません。宣言はブロックの先頭でのみ有効でした。

そう:

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

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

a = 1
if (e) {
  int i;

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

結果として得られるスタイルは、宣言が有効 (C99)ブロック項目になった後も継続されました。これは、一部は慣性によるものであり、一部は下位移植性のためであり、また、新しい宣言のスコープを確立することが理にかなっているからです。

于 2009-11-05T01:31:00.507 に答える
41

変数をスコープします。たとえば、変数tmp_argvは中括弧の間でのみ有効になります。

于 2009-11-05T01:28:20.793 に答える
13

私が最近発見したもう 1 つの使用例は、開閉セマンティクスがあり、「内部」コードを明確にマークしたい場合です。

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

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

于 2009-11-05T13:41:24.593 に答える
7

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

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

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

于 2009-11-05T01:30:31.460 に答える
6

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

于 2009-11-05T01:28:02.260 に答える
6

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

于 2009-11-05T01:28:57.687 に答える
1

それで全部ですか?たぶん、プログラマーはtmp_argvコードのどこか他の場所を使用しています。とのtmp_argv間は中括弧の外側から分離されているため、他の理由は考えられません。{}

于 2009-11-05T01:30:19.107 に答える
1

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

于 2009-11-05T03:59:40.240 に答える
-4

うーん-私はここでチャートから外れているかもしれませんが、そのようなブロック内で定義されたローカル変数はブロック外では有効ではないと思います

于 2009-11-05T01:28:02.230 に答える