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

为什么这个C程序在输出中打印奇怪的字符?,c,operator-precedence,getchar,control-characters,C,Operator Precedence,Getchar,Control Characters,我有以下计划: #include <stdio.h> int main() { int ch; while( ch = getchar() != '\n') { printf("Read %c\n",ch); } return 0; } 为什么会发生这种事?我看到的那个奇怪的字符是什么 Stackoverflow没有打印奇怪的字符。您可以在这里看到:您需要将括号放在以下位置: wh

我有以下计划:

#include <stdio.h>

int main()
{
        int ch;
        while( ch = getchar() != '\n') {
                printf("Read %c\n",ch);
        }  
        return 0;
}
为什么会发生这种事?我看到的那个奇怪的字符是什么


Stackoverflow没有打印奇怪的字符。您可以在这里看到:

您需要将括号放在以下位置:

while( (ch = getchar()) != '\n')
当然是
=
大于
=

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

while( ch = (getchar() != '\n') )
它读取一个字符,将其与换行符进行比较,然后将比较结果分配给ch。现在比较结果是
0
(输入换行符时)或
1
(输入任何其他内容时)

您看到的奇怪字符是值为
1
,ASCII 1没有可打印的符号,因此我猜是shell打印了值为
0001
的奇怪字符

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

GCC与
-Wall
一起使用时警告您:

warning: suggest parentheses around assignment used as truth value
根据语言的不同,编写此命令将导致意外行为。在C
中,=
之后计算=因此
ch
将为真或假。尝试:

(ch = getchar()) != '\n'
C(和C++)将while循环解释为:

while( ch = (getchar() != '\n')) {
因此
ch
获取值
1
(对于true),该值是不可打印的字符。您应该使用显式括号来固定优先级:

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

相同的优先查找引用:如果您使用的是gcc,请确保设置了-Wall标志。在它报告的许多常见问题中,有一个是。啊,的确如此。但这两个词都适用:)难道你没有更干净的词来表达悲惨的失败吗?事实上,我有-不知道为什么我昨天选择了这个词,但改变了它。
(ch = getchar()) != '\n'
while( ch = (getchar() != '\n')) {
 while( (ch = getchar()) != '\n') {