【发布时间】:2011-04-30 22:12:12
【问题描述】:
我已经看到新行 \n 在我一直在查看的几个代码示例中使用了 2 种不同的方式。第一个是'\n',第二个是"\n"。有什么区别,为什么要使用'\n'?
我知道'\n' 代表一个字符,"\n" 代表一个字符串,但这有关系吗?
【问题讨论】:
我已经看到新行 \n 在我一直在查看的几个代码示例中使用了 2 种不同的方式。第一个是'\n',第二个是"\n"。有什么区别,为什么要使用'\n'?
我知道'\n' 代表一个字符,"\n" 代表一个字符串,但这有关系吗?
【问题讨论】:
'\n' 是一个char 常量。
"\n" 是 const char[2]。
所以用法是这样的:
char newLine = '\n';
const char* charPointerStringNewLine = "\n"; // implicit conversion
const char charStringNewLine[2] = "\n";
string stringNewLine( "\n" );
简而言之:一个是指向字符数组的指针,另一个是单个字符。
【讨论】:
"\n" 是 const char[2],而不是 const char*。不过,前者可以隐式转换为后者。
'\n' 是一个字符文字。 "\n" 是一个字符串文字(基本上是一个字符数组)。
如果您将其写入普通流,差异并不重要。 std::cout << "\n"; 和std::cout << '\n'; 效果一样。
在几乎所有其他情况下,差异都很重要。 char 通常不能与字符数组或字符串互换。
例如,std::string 有一个采用 const char* 的构造函数,但它没有采用 char 的构造函数。你可以写std::string("\n");,但std::string('\n'); 不能编译。
std::string 也有一个构造函数,它接受 char 和复制它的次数。它没有一个需要const char* 和复制它的次数。所以你可以写std::string(5,'\n') 并得到一个由连续5个换行符组成的字符串。你不能写std::string(5, "\n");。
您使用的任何函数或操作都会告诉您它是为 char 定义的、为 C 样式的字符串定义的、通过重载定义的,还是两者都不定义。
【讨论】:
std::cout << '\n';.
我知道 '\n' 代表一个字符,而 "/n" 代表一个字符串,但这有关系吗?
如果您理解这一点,那么应该清楚它确实很重要。 C++ 标准库中的重载函数通常会隐藏这一事实,因此也许 C 中的一个示例会更有用:putchar 采用单个字符,因此只有 '\n' 是正确的,而 puts 和 printf 采用字符串,在这种情况下,只有"\n" 是正确的。
【讨论】:
'\n'是一个字符常量。
"\n" 是一个指向字符数组的指针,相当于{'\n', '\0'}(\n 加上空终止符)
编辑
我意识到我解释了差异,但没有回答问题。
你使用哪一个取决于上下文。如果您正在调用一个需要字符的函数,则使用 '\n',如果需要字符串,则使用 "\n"。
【讨论】:
单引号表示一个字符,双引号表示一个字符串。根据上下文,您可以选择使用哪种数据类型。
【讨论】: