0
while ((x[num++] = getchar()) != ' ');

これは一度にcharを読み取り、スペースに遭遇すると停止します。しかし、スペースで括弧をどのように評価しますか?括弧の結果は何ですか?それで、基本的に、これx[num++] = getchar()をスペースと比較するために、これは何に等しいのでしょうか?

この例を私のクラスの本の1つで見つけましたが、それは異なっていて警告を受けたので、それは良い習慣ではないと思いますか?評価はここでどのように行われますか?最初に読み取り値をに割り当て、x[num]次にそれをスペースと比較しますか?

while(x[num++] = getchar() != ' ');
4

2 に答える 2

3

Cでは、a = bです。に割り当てbてからa、を返しますa。したがって、whileループの条件は次のことを意味します。

  1. getchar()ユーザーの入力を取得するために呼び出す
  2. getcharの結果をに割り当てx[num]ます。
  3. num1ずつ増やします
  4. x[num]がスペースと等しくないかどうかを確認してください' '

すなわち

while (true) {
  x[num] = getchar();
  num ++;
  if (!(x[num] != ' '))
    break;
}

2番目の例は、まったく異なる動作をします。これは、式が括弧なしで!=割り当ての前に評価されるためです。=したがって、2番目の例は

  1. getchar()ユーザーの入力を取得するために呼び出す
  2. x[num]がスペースと等しくないかどうかを確認してください' '
  3. true手順2(またはfalse)の結果をに割り当てますx[num]
  4. num1ずつ増やします

警告は、誤っwhile (a = b)て意味するように書くのが簡単だからwhile (a == b)です。

于 2011-07-04T16:09:25.667 に答える
2

どちらのバージョンも適切なコーディングではありません。どちらも、スペースを読み取る前にEOFに到達する可能性を無視し、スペースを読み取る前にバッファをオーバーフローさせる可能性を無視します。

それ以外の場合、最初は正しいです。割り当てが含まれています:

x[num++] = getchar()

割り当ての結果は、割り当てられた値です。したがって、getchar()「X」を返す場合、割り当ての結果は「X」になります。次に、割り当ての結果が空白と比較されます。それらは異なり、ループが繰り返されます。が空白を返す場合getchar()、割り当ての結果も空白になり、空白は空白に等しいため、ループは終了します。

2番目は明らかに欠陥があります。割り当ての優先順位は。よりも低いため!=、結果はコードが次のように読み取られたかのようになります。

while (x[num++] = (getchar() != ' '))
    ;

つまり、文字は空白によって読み取られgetchar()て比較され、文字が空白でない場合は値1が生成され、空白の場合は値0が生成されます。この0または1はに割り当てられますx[num++]、次に論理条件として評価されます。結果が0の場合、ループは終了します。結果が1の場合、ループは続行されます。このバージョンでは、読み取られた文字が記録されないことに注意してください。これが、コンパイラが警告を出す理由です。それはほとんど常に間違いです。それが間違いではないという奇妙な機会に、コンパイラーに、そしてあなたの意図をコンパイラーに、そしてあなたの人間の聴衆、あなたのコードを読む他の人々に明確にするために追加の括弧を提供することによって、あなたはコンパイラーに伝えることができます。(覚えておいてください:6か月、あるいは6週間で戻ってきた場合、あなたは別の人になり、そのような微妙なことを覚えるのが難しいかもしれません。誰にでもわかりやすくしてください。および括弧の下のコード。)

コードはおそらく次のようになります。

int c;
int max = sizeof(x) - 1;
int num = 0;

while ((c = getchar()) != EOF && num < max && (x[num++] = c) != ' ')
    ;

特に、これはであるc必要があり、でintはないことに注意してくださいchar

于 2011-07-04T16:20:27.327 に答える