Dan*_*sen 2 c codeblocks character-encoding
在Windows 10(丹麦语)的Codeblocks中使用K&R中的代码示例.以下示例按预期工作:
#include <stdio.h>
int main() {
char c = 'a';
putchar(c);
}
Run Code Online (Sandbox Code Playgroud)
但是,下面打印一系列带有问号的方框,与我输入的字符数相同:
#include <stdio.h>
int main() {
char c;
while (c = getchar() != '\n') {
putchar(c);
}
}
Run Code Online (Sandbox Code Playgroud)
所以它看起来像编码问题.运行时,会在标题中打开一个命令提示符,其中包含"C:\ Users\username\Desktop\filename.exe",我的用户名包含丹麦字符"å",后面用"Õ"替换.命令提示符使用CP 850字符集.
(顺便说一句,我没有检查字符是否等于EOF,因为这会产生奇怪的结果.按Enter键打印预期的盒子数,再加上一个\n,但它不会结束程序.)
您在这里看到了运算符优先级的问题.正如您在此图表中看到的那样,=优先级低于!=.
这意味着getchar() != '\n'首先评估.
对于编译器,您的代码如下所示:
#include <stdio.h>
int main() {
char c;
while (c = (getchar() != '\n')) {
putchar(c);
}
}
Run Code Online (Sandbox Code Playgroud)
由于'c'得到的值不正确(表达式的真/假评估),输出不正确,程序会给出你看到的行为,但是
#include <stdio.h>
int main() {
char c;
while ((c = getchar()) != '\n') { //<----notice brackets around c=getchar
putchar(c);
}
}
Run Code Online (Sandbox Code Playgroud)
给出你期望的输出.这说明了您应该始终在这些表达式周围放置括号以确保安全.