16

Cプログラミング言語では、変数はコードブロックの先頭でのみ定義でき、変数は宣言されたブロックのスコープを持つことになるというのが私の理解です.それを念頭に置いて、私はそれが次の例のように、人為的に新しいスコープを作成することは悪い習慣と見なされます。

void foo()
{
     ... Do some stuff ...

     if(TRUE)
     {
         char a;
         int b;

         ... Do some more stuff ...
     }

     ... Do even more stuff ...
 }

マクロ定義で TRUE が 1 に設定されていると仮定すると、このコードは「優れたコード」と見なされますか?それとも、経験豊富なプログラマーが考えただけでうんざりするのでしょうか?

ご意見ありがとうございます。

編集:いくつかの回答に応えて、私が扱っているコードは、かなり古いレガシーシステムで動作する必要があります。C99 を想定して動作するのはよいことですが、実際に C99 を使用できるかどうかは保証できません。

4

17 に答える 17

51

if 文も必要ありません。{} でブロックを作成できます

ただし、それはおそらく別の機能である必要があります。

例:

#include <stdio.h>

int
main(int argc, char **argv) {
    int i = 0;
    {
        int i = 10;
        printf("%d\n", i);
    }
    printf("%d\n", i);
}
于 2009-02-12T15:15:43.677 に答える
16

私の知る限り、ifなしでスコープを作成できます。

次のようにブレースのみを使用します。

{
    int x;

}

そして、私は反対することをお勧めします

if (TRUE)

可読性を妨げるからです。

于 2009-02-12T15:15:42.973 に答える
7

おそらく、そのスコープの新しい関数を作成したいと思うでしょう。
独自のスコープが本当に必要な場合は、おそらく別の論理関数です。

于 2009-02-12T15:13:37.987 に答える
6

ifなしでスコープブロックを作成できるので、それはより良い考えです。

void foo() {
     ... Do some stuff ...
     {
         char a;
         int b;
         ... Do some more stuff ...
     }
     ... Do even more stuff ...
}
于 2009-02-12T15:15:27.467 に答える
6

C99 では、ブロックの途中でローカル変数を宣言できることに注意してください。

C99 は、1999 年からの C 標準のバージョンです。最近のほとんどの C コンパイラはそれをサポートしています。

于 2009-02-12T15:21:41.417 に答える
5

まず、新しいブロックは if ブロックである必要はありません。次のように、単に中かっこで囲まれたコードのセクションである可能性があります。

void foo() {
 ... Do some stuff ...

 {
     char a;
     int b;

     ... Do some more stuff ...
 }

 ... Do even more stuff ...
}

次に、C 標準 (C99 だと思います) に準拠する最新の C コンパイラでは、ブロック内の任意の場所で変数を宣言できるため、新しいブロックを作成する必要はまったくありません。

于 2009-02-12T15:17:52.797 に答える
4

非常に多くの回答が既に述べたように、「if」は必要ありません。ベアブロックを作成するだけです。しかし、私は別のポイントに行きたいです。C では、先頭だけでなく、ブロック内の任意の場所に変数宣言を作成できます。C89 では、その制限がありました。C99 から (今では 10 年になります)、その制限はもうありませんが、一部のコンパイラはいずれにせようめき声を上げます。ただし、-std=c99 オプションを使用して最新の C 標準を使用するように指定すると、GCC はそうしません。

デフォルトでうめき声を上げるコンパイラがまだ存在するため、宣言とコードを混在させることは好みません。互換性の理由から、ブロックの先頭に宣言を置き続けます。

于 2009-02-12T15:20:56.347 に答える
4

を削除できます。

if(TRUE)

中かっこをそのままにして、それ自体で新しい構文ブロック (複合ステートメント) を定義します。

これは、以前の false よりも間違いなくクリーンですが、なぜ新しいブロックを作成する必要があるのか​​を自問したい場合があります - サブルーチンを定義する方が良いでしょうか?

于 2009-02-12T15:15:53.503 に答える
3

私は自分自身をベテランとは呼びませんが、ちょっとうんざりしています.

それに関する私の問題は、ifステートメントが誰かに何かが実際に評価されていると信じ込ませることです...しかし、実行時に、マクロはtrueまたはfalseのいずれかであり、それが何か他のものであるという変更はありません。コードを含めるか含めないかのどちらかです。

やりたいことが #ifdef DEBUG のようなものである場合は、これがデバッグコードであることを読者に示すためにそれを行う必要があります...

于 2009-02-12T15:14:28.920 に答える
3

クリエイティブな人々のためにドアを開けたままにしておく:

#define TRUE 0
#define FALSE 1

中かっこを使用してスコープを宣言するだけです。

于 2009-02-12T15:18:17.897 に答える
2

ブロックの先頭で変数を定義するか、別の関数を使用してください。空の {} や代替のいずれかを使用して人為的なスコープを追加することは、適切な方法ではありません。

于 2009-02-13T00:23:50.520 に答える
2

if(true) 部分は必要ないと思います。

変数のスコープに必要なのは { } だけです。

于 2009-02-12T15:15:14.427 に答える
2

私の答えは次のとおりです。

これは、ベテランのプログラマーを考えただけでうんざりさせます。

于 2009-02-12T15:15:24.783 に答える
1

どうやら私は少数派ですが、「中かっこ」は通常のパターンから外れているため、読みづらいと思います。別の関数を定義せずにスコープブロックが必要な(確かにまれな)場合は、「if」を含めることを好みますが、マクロはなく、理由を説明するコメントを付けます。

if( 1 ) // just to establish scope
{
   // do stuff here
}
于 2009-02-12T16:26:38.013 に答える
1

古いコンパイラを使用していると仮定すると(私のように、古いハードウェア用です)、他の人が提案しているようにif(TRUE)をスキップし、本当に巨大な関数を持っていると仮定します(そもそも持ってはいけない魔女) 、それなら私はそれが一種の大丈夫だと思います。私はそれをしました、しかしそれは気分が良くありませんでした...

于 2009-02-12T15:37:30.300 に答える
1

C99 では、ほとんどどこでも変数を宣言できます。ただし、よほどの理由がない場合はご遠慮ください。最初に、関数をより小さな (おそらくインライン) 関数に分割してみてください。

そのようなことが理にかなっている唯一の場所は、関数の途中で初期化される変数がある場合です。たとえば、C++ でオブジェクトを作成する場合と同様です。

于 2009-02-12T15:19:28.987 に答える
1

あなたは時代遅れの仮定で働いていると思います。私は数か月間、GCC を使用してストレート C をコーディングしてきました。ブロックの先頭で変数を宣言する必要はありません。K&R の第 2 版では宣言する必要があります。このあまり役に立たない例のように、変数はどこでも宣言できます。

char* palstring;
palstring = malloc(LARGEST_STRING);
memset(palstring, 0, sizeof palstring);
fgets(palstring, LARGEST_STRING, fin);

char* cur = palstring;
char letter;
letter = *cur;

したがって、あなたが提案していることを行う必要はありません。言語は移動しました。

C 言語へのもう 1 つの優れた追加機能は、可変長配列です。これにより、配列をそのサイズと共に関数に渡すことができます。昔は、ポインターを渡すことしかできませんでした。

于 2009-02-12T15:20:43.227 に答える