どちらのバージョンも適切なコーディングではありません。どちらも、スペースを読み取る前に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
。