我有以下计划:
#include <stdio.h>
int main()
{
int ch;
while( ch = getchar() != '\n') {
printf("Read %c\n",ch);
}
return 0;
}
无论我输入什么,我都会得到:
Read
为什么会发生这种情况,我看到的奇怪的是什么?
Stackoverflow不会打印奇怪的字符。你可以在这里看到它:http://ideone.com/EfZHr
答案 0 :(得分:18)
您需要将括号括起来:
while( (ch = getchar()) != '\n')
!=
的{p} Precedence大于=
的<{3}}
while( ch = getchar() != '\n')
与:
相同while( ch = (getchar() != '\n') )
读取char的将其与换行符进行比较,然后将比较结果分配给ch。现在,比较结果为0
(输入换行符时)或1
(输入其他内容时)
您看到的奇怪的字符是control char,其值为1
,ASCII 1没有可打印的符号,所以我猜它的shell会打印出值为{{1的奇怪字符}} 在里面。
您可以通过将程序输出传递给八进制转储(od)来确认它:
0001
GCC与$ 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
一起使用时会警告您:
-Wall
答案 1 :(得分:2)
C(和C ++)将while循环解释为:
while( ch = (getchar() != '\n')) {
所以ch
得到值1
(对于true),这是一个不可打印的字符。您应该使用显式括号来修复优先级:
while( (ch = getchar()) != '\n') {
答案 2 :(得分:1)
ch = getchar() != '\n'
根据语言operator precedence,写入此内容会导致意外行为。在=
之后评估!=
,因此ch
将为真或假。尝试:
(ch = getchar()) != '\n'