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') )

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

您看到的奇怪字符是带有 value的控制字符1,ASCII 1 没有可打印的符号,所以我猜它是打印带有 value 的奇怪字符的外壳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获取值1(为真),这是一个不可打印的字符。您应该使用显式括号来修复优先级:

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

根据语言运算符的优先级,编写它会导致意外行为。在 C=中被评估之后,!=所以ch将是真或假。尝试:

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