(a)
string str = "Hello\nWorld";
当我打印str
时,输出为:
Hello
World
(b)
string str;
cin >> str; //given input as Hello\nWorld
当我打印str
时,输出为:
Hello\nWorld
(a)和(b)有什么区别?
答案 0 :(得分:58)
提供控制字符时,C ++编译器具有某些规则-
documentation。如您所见,当您在字符串文字中指定if (subsriber?.isUnsubscribed == true && isDataEmpty()) {
loadData()
}
时,它会由编译器替换为换行符(ASCII值为0xa)。因此,您得到的不是2个符号\n
和\
,而是一个带有二进制代码0xa的符号(我假设您使用ASCII编码),这使控制台在打印时将输出移至新行。读取字符串时,不会涉及编译器,并且字符串中包含实际的符号n
和\
。
答案 1 :(得分:15)
在字符串文字中指定时,“ \ n”将转换为匹配的ascii代码(在Linux上为n
),并按原样存储。它不会存储为反斜杠,后跟原义0x0a
。 Escape sequences只是为了您的方便,允许带有嵌入换行符的字符串文字。
另一方面,在终端中运行的shell不会进行此类替换:它会提交一个文字反斜杠和n
,它们将按原样打印。
要打印换行符,请输入换行符:
n
答案 2 :(得分:11)
cout <<“ Hello \ nworld”上的字符串由编译器转换为已编译的字符串,在其中将转义码转换为字符,因此cout函数在执行时不会看到两个字符“ \ n”字符串,但下一行字符的等效代码。
但是cin在运行时会获取每个键入字符的字符串,并且不会转换转义码。因此,如果要转换这些转义码,则必须创建替换函数。
答案 3 :(得分:7)
cin
不包括C ++编译器。字符串文字中的转义序列是C ++的词法分析器的功能,它是C ++编译器的一部分。流或多或少地为您提供了来自操作系统的内容(它们可能会执行某些CRLF-> CR转换或基于操作系统的类似操作,仅此而已)。
答案 4 :(得分:5)
为什么我从cin阅读时转义符不起作用?
因为流阅读器被定义为这种方式。在核心,每个字符都是单独读取的。只有高级功能为字符提供了附加含义。
当编译器处理字符串文字"Hello\nWorld"
时,其文件读取器也会向其传递两个字符。只有C ++编译器/解析器才能根据语言规则将它们转换为一个字符。
答案 5 :(得分:4)
字符串中的转义字符由编译器解释。序列\n
由两个实际字符组成,编译器在编译过程中将其转换为单个换行符。在命令行上输入相同序列时,不会以任何方式解释该序列,因此将导致您输入的正是两个字符。
如果要处理字符串以解释转义序列,则必须自己操作(或使用适当的库)。
答案 6 :(得分:4)
在已编译的代码中,字符文字 ’\n’
被特定于实现的值替换,运行时系统将其视为换行符。语言定义不需要任何特定值。
从控制台或文件读取输入时,不会编译传入的文本,并且字符序列“ \ n”没有任何特殊含义。它只是两个字符。