我在ubuntu终端gcc编译器上用c编程。 printf没有提供任何输出。请解释原因。
#include <stdio.h>
int main()
{
int c;
while (c = getchar() == EOF)
{
printf("%d\n", (int)c);
}
return 0;
}
答案 0 :(得分:3)
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;
}
答案 1 :(得分:0)
要修改other answer,请参阅operator precedence表。
等于运算符==
优先于赋值=
,所以在你的情况下,首先进行相等检查,然后结果将被赋值,这就是你不能想。所以,像
(c = getchar() == EOF)
分组如
( c = (getchar() == EOF) )
错误。
打印不打印超出预期结果,为什么?
要详细说明 无输出 部分,在您的情况下,比较结果为0或1.相关,引用C11
,章节§6.5.9
[...]如果是,每个运营商的收益率为1 指定的关系为true,如果为false则为0。结果的类型为
int
。 [...]
因此,指定的值为0
或1
,您尝试使用%c
格式说明符进行打印。此值没有可打印的表示,因此您不会看到任何输出。
FWIW,here's a list of printable and non-printable values.
解决方案:明确指出,使用一对括号来强制执行子表达式的顺序,例如
while ( (c = getchar()) != EOF )
那就是说,
main()
的符合签名为int main(void)
,至少在托管环境中。
对(int)
的强制转换是多余的,(如果排名低于int
),无论如何都会隐式提升所提供的参数。