奇怪的C输出操作顺序

时间:2014-07-02 05:26:11

标签: c

我正在从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文件时。教科书说我删除的一对括号是必要的,因为!=将在作业之前完成(因为!=的优先级高于=),但我不明白为什么修改后的代码打印出皱眉脸字符...

4 个答案:

答案 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() != EOF1的表达式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)
^

这将使你能够捕捉到比没有警告的情况下编译更多的潜在问题。