【发布时间】:2015-05-31 10:58:22
【问题描述】:
如果我在标准输入流中输入单词“Hello World”,该程序将打印出奇怪的框符号而不是预期的“Hello World”回到标准输出中。
#include <stdio.h>
int main(void)
{
// print out all characters from the stream until '/n' character is found
int ch;
while (ch = getchar() != '\n')
{
putchar(ch);
}
putchar('\n');
}
我知道如何解决这个问题。但是为什么这行代码不正确呢?
while (ch = getchar() != '\n')
【问题讨论】:
-
你可以顺便在这里找到一个运算符优先级列表:en.cppreference.com/w/c/language/operator_precedence。 (感觉有点傻用刚刚进来的百万张贴答案。:D)
-
有趣,我没想到 C 中的运算符优先级与 C# 和 Java 不同。
-
如果您正在考虑这种特殊情况,那么它在 Java 和 C# 中似乎是相同的。如果
x_eq_y = x == y被解释为(x_eq_y = x) == y,那就太糟糕了,作为一个愚蠢的例子。尽管 C 有一些不稳定的优先级(作者已承认这是一个错误,但仍被其他语言模仿以实现兼容性)。例如,x == y << z与您期望的x == (y << z)相同,而x == y & z与(x == y) & z相同。 -
在 Java 中试试这个:(fooBoolean = fooInteger == barInteger)。 == 运算符的优先级高于 = 运算符。
-
@JohnH 在任何情况下,Java 和 C# 中的运算符优先级都与 C 不同。不是反过来(因为 C 更老)。此外,为了在 C 中的优先级不再失败,您必须记住乘法和除法的优先级高于加法和减法。其他所有内容都需要括号。
标签: c io operator-precedence getchar putchar