背景:
在最高版本 9 的 Mac OS 版本中,文本文件的标准表示使用 ASCII CR(回车)字符(十进制值 13)来标记行尾。
Mac OS 10 与早期版本不同,它类似于 UNIX,并使用 ASCII LF(换行)字符(十进制值 10)来标记行尾。
问题是,在 OS X 之前的 Mac OS 版本中,字符常量'\n'
和C 和 C++ 编译器的值是什么?'\r'
有(至少)两种可能的方法可以采取:
- 将其视为
'\n'
ASCII LF 字符,并在输出到文本流和从文本流输入时将其与 CR 转换(类似于 Windows 系统上的 LF 和 CR-LF 之间的转换);或者 - 视为
'\n'
ASCII CR 字符,不需要对输入或输出进行转换。
第二种方法会有一些潜在的问题。一是假设'\n'
是 LF 的代码可能会失败。(无论如何,这样的代码本质上是不可移植的。)另一个是仍然需要有一个不同的值'\r'
,并且在基于 ASCII 的系统上 CR 是唯一合理的值。并且 C 标准不允许'\n' == '\r'
(感谢 mafso 找到引用,5.2.2 第 3 段),所以有些必须为'\r'
.
当N小于 10在 Mac OS N下编译和执行时,这个 C 程序的输出是什么?
#include <stdio.h>
int main(void) {
printf("'\\n' = %d\n", '\n');
printf("'\\r' = %d\n", '\r');
if ('\n' == '\r') {
printf("Hmm, this could be a problem\n");
}
}
这个问题适用于 C 和 C++。我想两者的答案都是一样的。
答案也可能因一个 C 编译器而异——但我希望编译器实现者能够保持彼此的一致性。
需要明确的是,我不是在问 Mac OS 的旧版本使用什么表示来表示文本文件中的行尾。我的问题是专门关于常量的值'\n'
以及'\r'
C 或 C++ 源代码中的值。我知道打印'\n'
(无论它的值是什么)到文本流会导致它被转换为系统的行尾表示(在本例中为 ASCII CR);该行为是 C 标准所要求的。