我刚开始通过书籍K& R开始学习C. 这是我的代码。
#include <stdio.h>
int main (){
int c;
char value = ((c = getchar()) != EOF);
while (value){
printf(" %c\n", c);
printf("%d :: value : %d\n",__LINE__,value);
value = ((c = getchar()) != EOF);
}
return 0;
}
这导致
a
a
10 :: value : 1
10 :: value : 1
b
b
10 :: value : 1
10 :: value : 1
我不明白为什么要打印value
2次?
答案 0 :(得分:3)
不是两次,只有一次。另一个是你的输入。 例如,您输入&#39; a&#39;,控制台将显示&#39; a&#39;首先,然后程序将在运行到语句时再打印一次:
printf(" %c\n", c);
答案 1 :(得分:2)
这将继续执行这两个printf(),直到您在stdin上遇到EOF,这可能是由EOT(控制D或某些平台上的控件Z)发出信号。
原因是因为预测试条件为(值),其中值计算如下:
((c = getchar()) != EOF);
这意味着对stdin执行一个字符的阻塞读取,将其存储在堆栈分配的整数c中,然后将比较结果与EOF存储到char值中。这意味着char值应该真的可能是bool,而不是char,因为它的值只能是零或一。
答案 2 :(得分:2)
getchar()
正在读取两个字符 - 您输入的字母,以及按“输入”时的换行符。
答案 3 :(得分:1)
在你的程序中做这个简单的改变:
#include <stdio.h>
int main ()
{
int c;
char value = ((c = getchar()) != EOF);
while (value)
{
printf(" %d\n", c); //print the int value of the character
printf("%d :: value : %d\n",__LINE__,value);
value = ((c = getchar()) != EOF);
}
return 0;
}
现在输出变为:
a
97 <-- ascii code of 'a'
9 :: value : 1
10 <-- ascii code of newline (line feed)
9 :: value : 1
b
98 <-- ascii code of 'b'
9 :: value : 1
10
9 :: value : 1
abcd <-- you could also do this
97
9 :: value : 1
98
9 :: value : 1
99
9 :: value : 1
100
9 :: value : 1
10
9 :: value : 1
<...>
显示每次读取字符时都会出现换行符(ASCII 10字符)。
答案 4 :(得分:0)
这只是因为你首先看到你刚在终端输入的字符,然后是程序打印的字符(第二个在右边稍微移位)。
但是,如果你在谈论value
,那么它只出现一次。最左边的值是变量__LINE__
的内容,另一个是value
(请参阅 printf
格式字符串以了解更多信息)。