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

use*_*821 6 c control-characters operator-precedence getchar

我有以下程序:

#include <stdio.h>

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

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

Read  
Run Code Online (Sandbox Code Playgroud)

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

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

cod*_*ict 18

您需要将括号括起来:

while( (ch = getchar()) != '\n')
Run Code Online (Sandbox Code Playgroud)

优先级!=比更大=

while( ch = getchar() != '\n')
Run Code Online (Sandbox Code Playgroud)

与:

while( ch = (getchar() != '\n') )
Run Code Online (Sandbox Code Playgroud)

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

您看到的奇怪的char是带有值的控件char,1没有ASCII 1的可打印符号,所以我猜它的shell会打印带有值的怪异char 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
Run Code Online (Sandbox Code Playgroud)

使用GCC时-Wall警告您:

warning: suggest parentheses around assignment used as truth value
Run Code Online (Sandbox Code Playgroud)