6

私は次のプログラムを持っています:

#include <stdio.h>

int main()
{
        int ch;
        while( ch = getchar() != '\n') {
                printf("Read %c\n",ch);
        }  
        return 0;
}

何を入力しても、次のようになります。

Read  

なぜこれが起こっているのですか、そして私が見るその奇妙な文字は何ですか?

Stackoverflowは奇妙な文字を出力していません。あなたはここでそれを見ることができます:http://ideone.com/EfZHr

4

3 に答える 3

18

括弧は次のように配置する必要があります。

while( (ch = getchar()) != '\n')

の優先順位はの!=よりも大きい=

while( ch = getchar() != '\n')

と同じです:

while( ch = (getchar() != '\n') )

これは、charを読み取り、それを改行と比較してから、比較結果をchに割り当てます。これで、比較の結果は0(改行が入力された1とき)または(他に何かが入力されたとき)になります。

表示されている奇妙な文字は、値を持つコントロール文字1です。ASCII1の印刷可能な記号はないので、値を持つ奇妙な文字を印刷するシェルだと思います0001

プログラム出力をオクタルダンプ(od)にパイプすることで確認できます:

$ echo 'a' | ./a.out | od -bc         # user entered 'a'
0000000 122 145 141 144 040 001 012
          R   e   a   d     001  \n
here you go  ----------------^


$ echo '\n' | ./a.out | od -bc        # user entered '\n'
0000000

GCCを使用すると、次のように-Wall警告されます。

warning: suggest parentheses around assignment used as truth value
于 2010-09-02T12:08:46.943 に答える
2

C(およびC ++)は、whileループを次のように解釈します。

while( ch = (getchar() != '\n')) {

したがって、印刷できない文字であるch値(trueの場合)を取得します。1優先順位を修正するには、明示的な括弧を使用する必要があります。

 while( (ch = getchar()) != '\n') {
于 2010-09-02T12:11:50.363 に答える
1
ch = getchar() != '\n'

これを書き込むと、言語演算子の優先順位によっては予期しない動作が発生します。C=では、後で評価される!=のでch、trueまたはfalseになります。試す:

(ch = getchar()) != '\n'
于 2010-09-02T12:11:40.667 に答える