我正在从C教科书中学习,该教科书具有以下用于获取输入和打印输出的代码:
#include <stdio.h>
main(){
int c;
while ((c=getchar())!=EOF)
putchar(c);
printf("%c\n", c);
}
为了尝试理解语法是如何工作的,我摆弄了上面的代码块,即删除围绕c = getchar()的括号对。所以代码现在看起来如下:
#include <stdio.h>
main(){
int c;
while (c=getchar()!=EOF)
putchar(c);
printf("%c\n", c);
}
一切仍然按预期工作,但是,现在除了第一行之外的每一行(输入和输出)前面都有两个皱眉脸:( :(当我运行.exe文件时。教科书说我删除的一对括号是必要的,因为!=
将在作业之前完成(因为!=
的优先级高于=
),但我不明白为什么修改后的代码打印出皱眉脸字符...
答案 0 :(得分:1)
getchar()!=EOF
当char读取不是EOF时等于1。所以你将c设置为1然后打印出来......它就像你所看到的“皱眉脸”一样。
试图了解语法的工作原理
虽然测试用例很适合检查您对语言的语法和语义规则的理解,但它们并不适合学习它们。有许多文本和教程可以解释C的语法,特别是它的表达式语法和优先级规则。
答案 1 :(得分:1)
c = getchar() != EOF
运营商优先级:http://en.cppreference.com/w/cpp/language/operator_precedence
查看=
下面的!=
方式?这就是原因。您的代码(概念上)评估为:
int x = getchar() != EOF;
int c = x;
括号不是可选的。你的版本:
c = (getchar != EOF)
不一样:
(c = getchar()) != EOF
答案 2 :(得分:1)
while(c = getchar() != EOF) {...}
此处,c
未指定getchar
的返回值,而是指定getchar() != EOF
或1
的表达式0
的值取决于是否属实。
因此输出实际上是ASCII 1
。它们不是可打印的字符。您的机器输出ASCII 1
作为皱眉脸。
答案 3 :(得分:0)
无论何时在条件表达式中执行赋值,都必须将赋值括在括号中。正如其他人所指出的那样,否则,在分配之前评估条件。你需要养成传递额外标志的习惯,告诉编译器输出 ALL 警告。至少-Wall
(显示所有警告)。例如:
gcc -Wall yourfile.c -o output
如果您尝试使用-Wall
进行编译,则会收到:
warning: suggest parentheses around assignment used as truth value [-Wparentheses]
while (c=getchar()!=EOF)
^
这将使你能够捕捉到比没有警告的情况下编译更多的潜在问题。