为什么这个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') {