【问题标题】:Printf not printing out the expected result, why? [closed]Printf 没有打印出预期的结果,为什么? [关闭]
【发布时间】:2017-05-17 18:23:13
【问题描述】:

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

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

【问题讨论】:

  • while (c = getchar() == EOF) --> while ((c = getchar()) == EOF)
  • 无需将c 转换为int,因为对于可变参数函数,对int 的提升是隐式完成的。
  • @alk Unclear:你指的是对int 的隐含提升?
  • @chux: ... 在传递给可变参数函数时,对于等级低于int 的参数,会隐式提升到int
  • @alk 是的,同意你说的是真的,但这在这里如何应用?唯一的变量是int c,并且排名不低于int,并且不会发生晋升。

标签: c gcc printf output getchar


【解决方案1】:
 c = getchar() == EOF

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

这意味着对于您的代码,c = 0 几乎一直都是。所以循环while(0)没有被执行。

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

另外,不需要将c 转换为int

 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;
}

【讨论】:

  • Similar question 回答这个问题:您所指的促销是什么“因为默认参数促销会自动执行。”?同意“无需将int c 转换为int”部分。
【解决方案2】:

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

相等运算符== 的优先级高于赋值=,因此在您的情况下,首先进行相等性检查,然后分配结果,这是您不想要的。所以,像

这样的声明
  (c = getchar() == EOF)

像这样分组

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

这是错误

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

详细说明 no output 部分,在您的情况下,比较的结果是 0 或 1。相关,引用 C11,第 §6.5 章.9

[...] 如果 指定的关系为真,如果为假,则为 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)无论如何,提供的参数都会被隐式提升。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-07
    • 2020-09-26
    • 2011-07-08
    相关资源
    最近更新 更多