C ++ Literals
环境:
我对数值文字前缀的理解是它们对于确定数值类型(不确定)很有用。但是,我对字符和字符串文字前缀和后缀有很多困惑。我读了很多,并花了几天时间试图了解情况,但我得到了更多的问题和答案。所以我认为堆栈溢出可能会有很多帮助。
Qs的:
1-字符串前缀u8 u U L的正确用法是什么?
我有以下代码作为示例:
#include <iostream>
#include <string>
using namespace std;
int main()
{
cout << "\n\n Hello World! (plain) \n";
cout << u8"\n Hello World! (u8) \n";
cout << u"\n Hello World! (u) \n";
cout << U"\n Hello World! (U) \n";
cout << L"\n Hello World! (plain) \n\n";
cout << "\n\n\n";
}
输出如下:
Hello World! (纯)
Hello World! (U8)
0x47f0580x47f0840x47f0d8
Q2:为什么U u ans L有这样的输出?我预计只是确定类型不进行编码映射(如果是)。
Q3是否有关于UTF-8等编码的简单和重点参考。我对它们很困惑,此外我怀疑控制台应用程序是否能够处理它们。我认为了解它们至关重要。
问题4:另外,我将逐步介绍自定义类型文字。
答案 0 :(得分:3)
首先看:http://en.cppreference.com/w/cpp/language/string_literal
std::cout
的类操作符<<
已正确重载以打印const char*
。这就是打印前两个字符串的原因。
cout << "\n\n Hello World! (plain) \n"; cout << u8"\n Hello World! (u8) \n";
正如预期的那样,打印 1 :
Hello World! (plain) Hello World! (u8)
同时std::cout
的课程对<<
,const char16_t*
和const char32_t*
没有特殊const wchar_t*
重载,因此它会匹配{{1}打印指针的重载,这就是原因:
<<
打印:
cout << u"\n Hello World! (u) \n"; cout << U"\n Hello World! (U) \n"; cout << L"\n Hello World! (plain) \n\n";
如您所见,实际上有3个指针值:0x47f0580x47f0840x47f0d8
,0x47f058
和0x47f084
但是,对于最后一个,您可以使用0x47f0d8
std::wcout
打印
std::wcout << L"\n Hello World! (plain) \n\n";
1:由于UTF-8的前几个代码点的直接ASCII mapping, Hello World! (plain)
字面值按预期打印。
答案 1 :(得分:1)
1)缩小多字节字符串文字。未加前缀的字符串文字的类型为const char[]
。
2)宽字符串文字。 L"..."
字符串文字的类型为const wchar_t[]
。
3)UTF-8编码的字符串文字。 u8"..."
字符串文字的类型为const char[]
。
4)UTF-16编码的字符串文字。 u"..."
字符串文字的类型为const char16_t[]
。
5)UTF-32编码的字符串文字。 U"..."
字符串文字的类型为const char32_t[]
。
6)原始字符串文字。用于避免任何字符的转义,分隔符之间的任何内容都成为字符串的一部分。前缀(如果存在)具有与上述相同的含义。
std::cout
需要单字节字符,否则可以输出0x47f0580x47f0840x47f0d8
之类的值。如果您尝试输出包含多字节字符(char16_t,char32_t或wchar_t)的文字,则需要使用std::wcout
将它们输出到控制台,或将它们转换为单字节字符类型。原始字符串文字对于格式化输出非常方便。 Raw字符串文字的示例是R"~(This is the text that will be output just as I typed it into the code editor!)~"
,它将是单字节字符串。如果它的前缀是任何多字节限定符,则原始字符串文字将是多字节的。 Here是关于字符串文字的非常全面的参考。