Printf没有打印出预期的结果,为什么?

时间:2017-01-03 15:49:47

标签: c gcc printf output getchar

我在ubuntu终端gcc编译器上用c编程。 printf没有提供任何输出。请解释原因。

#include <stdio.h>
int main()
{
    int c;
    while (c = getchar() == EOF)
    {
        printf("%d\n", (int)c);
    }
    return 0;
}

2 个答案:

答案 0 :(得分:3)

 c = getchar() == EOF

表示c = (getchar() == EOF),因为赋值表达式是右关联的,并且除了逗号表达式之外,所有表达式的优先级最低。

对您的代码来说意味着c = 0几乎所有时间。因此,循环while(0)不会被执行。

您的意思是while ((c = getchar()) != EOF)

此外,无需在

中投放cint
 printf("%d\n", (int)c);

因为default argument promotions会自动执行此操作。

正确的代码可能如此:

#include <stdio.h>
int main()
{
    int c;
    while ((c = getchar()) != EOF)
        printf("%d\n", c);
    return 0;
}

答案 1 :(得分:0)

要修改other answer,请参阅operator precedence表。

等于运算符==优先于赋值=,所以在你的情况下,首先进行相等检查,然后结果将被赋值,这就是你不能想。所以,像

这样的陈述
  (c = getchar() == EOF)

分组如

  ( c = (getchar() == EOF) )

错误

  

打印不打印超出预期结果,为什么?

要详细说明 无输出 部分,在您的情况下,比较结果为0或1.相关,引用C11,章节§6.5.9

  

[...]如果是,每个运营商的收益率为1   指定的关系为true,如果为false则为0。结果的类型为int。 [...]

因此,指定的值为01,您尝试使用%c格式说明符进行打印。此值没有可打印的表示,因此您不会看到任何输出。

FWIW,here's a list of printable and non-printable values.

解决方案:明确指出,使用一对括号来强制执行子表达式的顺序,例如

 while ( (c = getchar()) != EOF )

那就是说,

  • main()的符合签名为int main(void),至少在托管环境中。

  • (int)的强制转换是多余的,(如果排名低于int ),无论如何都会隐式提升所提供的参数。

    < / LI>