为什么这个C程序在输出中打印奇怪的字符?

我有以下程序:

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

无论我输入什么,我得到:

 Read 

为什么会发生这种情况,我看到的奇怪的是什么?

Stackoverflow不会打印奇怪的字符。 你可以在这里看到它: http : //ideone.com/EfZHr

您需要将括号括起来:

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

!= 优先级大于!= 优先级

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

与:

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

读取char将其与换行符进行比较,然后将比较结果分配给ch。 现在比较的结果是0 (输入换行时)或1 (输入其他任何内容时)

您看到的奇怪的char是值为1控件char ,没有ASCII 1的可打印符号,所以我猜它的shell打印出值为0001的怪异char。

您可以通过将程序输出传递给八进制转储(od)来确认它:

 $ echo 'a' | ./a.out | od -bc # user entered 'a' 0000000 122 145 141 144 040 001 012 R ead 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 

C(和C ++)将while循环解释为:

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

所以ch得到值1 (对于true),这是一个不可打印的字符。 您应该使用显式括号来修复优先级:

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

写入此操作将导致意外行为,具体取决于语言运算符的优先级 。 在C =之后评估!=所以ch将为真或假。 尝试:

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