0

私は現在、暇なときにいくつかの C を学ぼうとしています。私は Java である程度の経験があるため、中括弧を使用して ie 変数のスコープを制限することに慣れています。Brian W. Kernighan/Dennis M. Ritchie の著書 "The C Programming Language" では、中括弧をあまり使用していないようです。 Java パースペクティブ)。たとえば、コードが次の本の1.6です。

while((c = getchar())) != EOF)
    if (c >= '0' && c <= '9')
        ++ndigit[c-'0'];
    else if() /*and so forth...*/
        ++nwhite;
    else
        ++nother;

Java の観点からは、中括弧がないため、最初のステートメントのみが実行されることに慣れていますが、インデントはすべてが実行されることを示唆しています (if、else if、else)。

ここで何が実行され、なぜ実行されるのでしょうか? if、else if、else はすべて while ループの範囲内ですか? それをよりよく理解するために読むことができる、参照すべき規則はありますか? 前もって感謝します。

4

4 に答える 4

4

、、、whileおよびifの後else ifelse1 つのステートメントが続きます。このステートメントは、C の実際の行、またはブロック ステートメント (中かっこで囲まれた) にすることができます。、ifelse ifelse1 つのブロックと見なします。

したがって、中括弧を使用すると、これは同等になります。

while((c = getchar())) != EOF) {
    if (c >= '0' && c <= '9') {
        ++ndigit[c-'0'];
    }
    else if() {  /*and so forth...*/
        ++nwhite;
    }
    else {
        ++nother;
    }
}
于 2013-08-06T13:55:28.797 に答える
2

C では、Java と同様に、anìfおよび awhileは、本体として 1 つのステートメントを持ち、本体として1 つのステートメントをif持つオプションのelse句を持つことができます。また、1 つのステートメントを持つことができるほとんどの場所では、中かっこで囲まれたステートメントのリストであるステートメント ブロックを使用できます。これは C と Java の違いではありません。

あいまいさを避けるために、2 つの if と 1 つの else がある場合、else は最後のものを参照するように定義されます。私はe。

if(a) x if(b) y else z

意味するように定義されています

if(a) x { if(b) y else z }

ではない

if(a) x { if(b) y } else z

ここで、x、y、および z はステートメントであり、ステートメント ブロックにすることもできます。

ただし、これまで述べてきたように、中括弧を省略するとエラーが発生しやすくなるため、多くのコーディング ガイドラインでは常に中括弧を使用するように提案されています。

于 2013-08-06T14:06:21.710 に答える
1

if ステートメントに中かっこが含まれていない場合は、その後に最大 1 つのセミコロンをインライン化でき、中かっこが次のように自動的に想定されます。

while((c = getchar())) != EOF){
    if (c >= '0' && c <= '9')
    {
        ++ndigit[c-'0'];
    }
    else if() /*and so forth...*/
    {
        ++nwhite;
    }
    else
    {
        ++nother; 
    }
 }

したがって、これは有効です:

 while(true) i++;

そして、これは有効ではありません:

 while(true) i++; break; printf("hello");

 if(true) printf("Hello"); break; 
于 2013-08-06T13:54:35.730 に答える
1

命令を 1 つのブロックとして扱うことができます。if/else if/else命令は実際には分割elseできず、単独で存在することはできません。

余談ですが、次のような状況があると混乱することがあります

if(something)
   if (somethingOther)
     ....
else
   .....

コードが十分に長い場合、 this をどこに付けるか混乱する可能性があるためelse、常に中かっこを使用することをお勧めします。コメントで述べたように、else常に「最も近い」にアタッチしifます。

于 2013-08-06T13:57:30.410 に答える