我看过一些代码示例,发现新行\n
被用于两种不同的方式。第一种是'\n'
,第二种是"\n"
。有什么区别?为什么要使用'\n'
?
我知道'\n'
代表一个字符,"\n"
代表一个字符串,但这有关系吗?
'\n'
是一个字符常量。
"\n"
是指向字符数组的指针,等同于{'\n', '\0'}
(即\n
加上空终止符)。
编辑
我意识到我解释了它们之间的区别,但没有回答问题。
你使用哪个取决于上下文。如果你调用需要字符参数的函数,则使用'\n'
,如果调用需要字符串参数的函数,则使用"\n"
。
'\n'
是一个字符字面量。 "\n"
是一个字符串字面量(基本上是一个字符数组)。
如果你将它写入普通流中,这种区别并不重要。 std::cout << "\n";
与std::cout << '\n';
具有相同的效果。
在几乎所有其他情况下,这种差异都很重要。一个字符通常不能与一个字符数组或一个字符串互换使用。
例如,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");
。
你使用的任何函数或操作都会告诉你它是否定义为一个字符,一个C风格的字符串,通过重载两者都支持或都不支持。
'\n'
是一个char
常量。
"\n"
是一个const char[2]
。
因此,使用方式如下:
char newLine = '\n';
const char* charPointerStringNewLine = "\n"; // implicit conversion
const char charStringNewLine[2] = "\n";
string stringNewLine( "\n" );
const char[2]
,而不是一个 const char*
。不过前者可以隐式转换为后者。 - GManNickG单引号表示一个字符,双引号表示一个字符串。根据上下文,您可以选择使用哪种数据类型进行操作。
std::cout << '\n';
。 - leoger