275 lines
32 KiB
HTML
275 lines
32 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="zh" dir="ltr" class="client-nojs" xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh">
|
|
<head><meta http-equiv="x-ua-compatible" content="ie=edge">
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
|
<title>字符字面量</title>
|
|
<link rel="stylesheet" href="ext.css" />
|
|
<link rel="stylesheet" href="site_modules.css" />
|
|
</head>
|
|
<body class="mediawiki ltr sitedir-ltr ns-0 ns-subject page-cpp_language_character_literal skin-cppreference2 action-view cpp-navbar">
|
|
<div id="cpp-content-base">
|
|
<div id="content"><a id="top"></a>
|
|
<h1 id="firstHeading" class="firstHeading">字符字面量</h1>
|
|
<div id="bodyContent">
|
|
<div id="contentSub"><span class="subpages">< <a href="cpp.html">cpp</a>‎ | <a href="cpp-language.html">language</a></span></div>
|
|
<div id="mw-content-text" lang="zh" dir="ltr" class="mw-content-ltr" xml:lang="zh">
|
|
<h3><span class="mw-headline" id=".E8.AF.AD.E6.B3.95">语法</span></h3>
|
|
<table class="t-sdsc-begin">
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td><code><b>'</b></code><span class="t-spar">c字符</span> <code><b>'</b></code></td>
|
|
<td>(1)</td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td><code><b>u8'</b></code><span class="t-spar">c字符</span> <code><b>'</b></code></td>
|
|
<td>(2)</td>
|
|
<td><span class="t-mark-rev t-since-cxx17">(C++17 起)</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td><code><b>u'</b></code><span class="t-spar">c字符</span> <code><b>'</b></code></td>
|
|
<td>(3)</td>
|
|
<td><span class="t-mark-rev t-since-cxx11">(C++11 起)</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td><code><b>U'</b></code><span class="t-spar">c字符</span> <code><b>'</b></code></td>
|
|
<td>(4)</td>
|
|
<td><span class="t-mark-rev t-since-cxx11">(C++11 起)</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td><code><b>L'</b></code><span class="t-spar">c字符</span> <code><b>'</b></code></td>
|
|
<td>(5)</td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td><code><b>'</b></code><span class="t-spar">c字符序列</span> <code><b>'</b></code></td>
|
|
<td>(6)</td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td><code><b>L'</b></code><span class="t-spar">c字符序列</span> <code><b>'</b></code></td>
|
|
<td>(7)</td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
</table>
|
|
<table class="t-par-begin">
|
|
<tr class="t-par">
|
|
<td><span class="t-spar">c字符</span></td>
|
|
<td>-</td>
|
|
<td>下列之一:
|
|
<ul>
|
|
<li>一个<span class="t-spar">基础c字符</span></li>
|
|
<li>一个转义序列,定义见<a href="cpp-language-escape.html">转义序列</a></li>
|
|
<li>一个通用字符名,定义见<a href="cpp-language-escape.html">转义序列</a></li>
|
|
</ul>
|
|
</td>
|
|
</tr>
|
|
<tr class="t-par">
|
|
<td><span class="t-spar">基础c字符</span></td>
|
|
<td>-</td>
|
|
<td>来自<span class="t-rev-inl t-until-cxx23"><span><a href="cpp-language-translation_phases.html#.E9.98.B6.E6.AE.B5_5">源字符集</a></span> <span><span class="t-mark-rev t-until-cxx23">(C++23 前)</span></span></span><span class="t-rev-inl t-since-cxx23"><span><a href="cpp-language-charset.html#.E7.BF.BB.E8.AF.91.E5.AD.97.E7.AC.A6.E9.9B.86">翻译字符集</a></span> <span><span class="t-mark-rev t-since-cxx23">(C++23 起)</span></span></span>去掉单引号(<code><b>'</b></code>)、反斜杠(<code><b>\</b></code>)和换行符后的字符</td>
|
|
</tr>
|
|
<tr class="t-par">
|
|
<td><span class="t-spar">c字符序列</span></td>
|
|
<td>-</td>
|
|
<td>两个或更多个 <span class="t-spar">c字符</span></td>
|
|
</tr>
|
|
</table>
|
|
<h3><span class="mw-headline" id=".E8.A7.A3.E9.87.8A">解释</span></h3>
|
|
<div class="t-li1"><span class="t-li">1)</span> 通常字符字面量,例如 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="st0">'a'</span></span></span> 或 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="st0">'<span class="es1">\n</span>'</span></span></span> 或 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="st0">'<span class="es5">\13</span>'</span></span></span>。这种字面量具有 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">char</span></span></span> 类型,且其值等于<span class="t-rev-inl t-until-cxx23"><span><span class="t-spar">c字符</span> 在<a href="cpp-language-charset.html#.E6.89.A7.E8.A1.8C.E5.AD.97.E7.AC.A6.E9.9B.86.EF.BC.88.E6.97.A7.E5.AE.9A.E4.B9.89.EF.BC.89">执行字符集</a>中的表示</span> <span><span class="t-mark-rev t-until-cxx23">(C++23 前)</span></span></span><span class="t-rev-inl t-since-cxx23"><span>来自<a href="cpp-language-charset.html#.E4.BB.A3.E7.A0.81.E5.8D.95.E5.85.83.E4.B8.8E.E5.AD.97.E9.9D.A2.E9.87.8F.E7.BC.96.E7.A0.81">通常字面量编码</a>的对应代码单元</span> <span><span class="t-mark-rev t-since-cxx23">(C++23 起)</span></span></span>。</div>
|
|
<div class="t-li1"><span class="t-li">2)</span> UTF-8 字符字面量,例如 <span class="t-c"><span class="mw-geshi cpp source-cpp">u8<span class="st0">'a'</span></span></span>。这种字面量具有 <span class="t-rev-inl t-until-cxx20"><span><span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">char</span></span></span></span> <span><span class="t-mark-rev t-until-cxx20">(C++20 前)</span></span></span><span class="t-rev-inl t-since-cxx20"><span><span class="t-c"><span class="mw-geshi cpp source-cpp">char8_t</span></span></span> <span><span class="t-mark-rev t-since-cxx20">(C++20 起)</span></span></span> 类型,且其值等于 <span class="t-spar">c字符</span> 的 ISO 10646 码位值,只要码位值能以单个 UTF-8 编码单元表示(即 <span class="t-spar">c字符</span> 处于范围 0x0-0x7F(含边界)内)。</div>
|
|
<div class="t-li1"><span class="t-li">3)</span> UTF-16 字符字面量,例如 <span class="t-c"><span class="mw-geshi cpp source-cpp">u<span class="st0">'猫'</span></span></span>,但不是 <span class="t-c"><span class="mw-geshi cpp source-cpp">u<span class="st0">'🍌'</span></span></span>(<span class="t-c"><span class="mw-geshi cpp source-cpp">u<span class="st0">'<span class="es4">\U0001f34c</span>'</span></span></span>)。这种字面量具有 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">char16_t</span></span></span> 类型,且其值等于 <span class="t-spar">c字符</span> 的 ISO 10646 码位值,只要该值能以单个 UTF-16 编码单元表示(即 <span class="t-spar">c字符</span> 处于范围 0x0-0xFFFF(含边界)内)。</div>
|
|
<div class="t-li1"><span class="t-li">4)</span> UTF-32 字符字面量,例如 <span class="t-c"><span class="mw-geshi cpp source-cpp">U<span class="st0">'猫'</span></span></span> 或 <span class="t-c"><span class="mw-geshi cpp source-cpp">U<span class="st0">'🍌'</span></span></span>。这种字面量具有 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">char32_t</span></span></span> 类型,且其值等于 <span class="t-spar">c字符</span> 的 ISO 10646 码位值。</div>
|
|
<div class="t-li1"><span class="t-li">5)</span> 宽字符字面量,例如 <span class="t-c"><span class="mw-geshi cpp source-cpp">L<span class="st0">'β'</span></span></span> 或 <span class="t-c"><span class="mw-geshi cpp source-cpp">L<span class="st0">'猫'</span></span></span>。这种字面量具有 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">wchar_t</span></span></span> 类型,且其值等于<span class="t-rev-inl t-until-cxx23"><span><span class="t-spar">c字符</span> 在执行宽字符集中的值</span> <span><span class="t-mark-rev t-until-cxx23">(C++23 前)</span></span></span><span class="t-rev-inl t-since-cxx23"><span>来自宽字面量编码的对应代码单元</span> <span><span class="t-mark-rev t-since-cxx23">(C++23 起)</span></span></span>。</div>
|
|
<div class="t-li1"><span class="t-li">6)</span> 通常多字符字面量(条件性支持),例如 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="st0">'AB'</span></span></span>,具有 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">int</span></span></span> 类型和实现定义的值。</div>
|
|
<div class="t-li1"><span class="t-li">7)</span> 宽多字符字面量(条件性支持),例如 <span class="t-c"><span class="mw-geshi cpp source-cpp">L<span class="st0">'AB'</span></span></span>,具有 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">wchar_t</span></span></span> 类型和实现定义的值。</div>
|
|
<h4><span class="mw-headline" id=".E4.B8.8D.E5.8F.AF.E7.BC.96.E7.A0.81.E5.AD.97.E7.AC.A6">不可编码字符</span></h4>
|
|
<p><span class="t-v">(1)</span> 中,如果 <span class="t-spar">c字符</span> 不是数值转义序列且无法在执行字符集中表示为单个字节,那么该字符字面量受条件性支持,具有 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">int</span></span></span> 类型和实现定义的值。</p>
|
|
<p><span class="t-v">(2-4)</span> 中,如果 <span class="t-spar">c字符</span> 不是数值转义序列且无法在关联字符编码中表示为单个编码单元,那么字符字面量非良构。</p>
|
|
<p><span class="t-v">(5)</span> 中, 如果 <span class="t-spar">c字符</span> 不是数值转义序列且无法在执行宽字符集中表示为单个编码单元(例如在 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">wchar_t</span></span></span> 为 16 位的 Windows 上的非 BMP 值),那么该字符字面量受条件性支持,具有 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">wchar_t</span></span></span> 类型和实现定义的值。</p>
|
|
<h4><span class="mw-headline" id=".E6.95.B0.E5.80.BC.E8.BD.AC.E4.B9.89.E5.BA.8F.E5.88.97">数值转义序列</span></h4>
|
|
<p>数值(八进制与十六进制)转义序列能用于指定字符的值。</p>
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-since-cxx23">
|
|
<td>
|
|
<p>如果字符字面量只包含一个数值转义序列,且该转义序列指定的值能以其类型的无符号版本表示,那么字符字面量拥有与指定值(可能在转换到字符类型后)相同的值。</p>
|
|
<p>UTF-<i>N</i> 字符字面量能拥有其类型可表示的任意值。即使该值对应的码位在 Unicode 中不合法或在 UTF-<i>N</i> 中无法以单个编码单元表示,该值的数值转义序列依然可以指定它。例如 <span class="t-c"><span class="mw-geshi cpp source-cpp">u8<span class="st0">'<span class="es2">\xff</span>'</span></span></span> 良构并等于 <span class="t-c"><span class="mw-geshi cpp source-cpp">char8_t<span class="br0">(</span><span class="nu12">0xFF</span><span class="br0">)</span></span></span>。</p>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-cxx23">(C++23 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
<p><br /></p>
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-until-cxx23">
|
|
<td>
|
|
<p>如果一个通常或宽字符字面量中用来指定值的数值转义序列指定了一个无法分别以 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">char</span></span></span> 或 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">wchar_t</span></span></span> 表示的值,那么该字符字面量的值由实现定义。</p>
|
|
</td>
|
|
<td><span class="t-mark-rev t-until-cxx23">(C++23 前)</span></td>
|
|
</tr>
|
|
<tr class="t-rev t-since-cxx23">
|
|
<td>
|
|
<p>如果一个有单个 <span class="t-spar">c字符</span> 的通常或宽字符字面量中用来指定值的数值转义序列所指定的值能分别以 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">char</span></span></span> 或 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">wchar_t</span></span></span> 的底层类型的无符号版本表示,那么该字面量的值是转换到字面量类型的有该无符号整数类型与指定值的整数值。否则程序非良构。</p>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-cxx23">(C++23 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
<p><br /></p>
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-since-cxx11">
|
|
<td>
|
|
<p>如果一个 UTF-<i>N</i> 字符字面量中用来指定值的数值转义序列所指定的值不能以对应的 <code>char<i>N</i>_t</code> 表示,那么<span class="t-rev-inl t-until-cxx17"><span>字符字面量的值由实现定义</span> <span><span class="t-mark-rev t-until-cxx17">(C++17 前)</span></span></span><span class="t-rev-inl t-since-cxx17"><span>程序非良构</span> <span><span class="t-mark-rev t-since-cxx17">(C++17 起)</span></span></span>。</p>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-cxx11">(C++11 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
<h3><span class="mw-headline" id=".E6.B3.A8.E8.A7.A3">注解</span></h3>
|
|
<p>多字符字面量是 C 从 B 编程语言继承而来的。尽管 C 或 C++ 标准不指定,大多数编译器(值得注意的例外是 MSVC )也如 B 中所指定实现多字符字面量:字面量中的每个字符的值以大端序零填充右对齐顺序初始化结果整数的相继字节,例如 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="st0">'<span class="es5">\1</span>'</span></span></span> 的值为 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="nu12">0x00000001</span></span></span> 而 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="st0">'<span class="es5">\1</span><span class="es5">\2</span><span class="es5">\3</span><span class="es5">\4</span>'</span></span></span> 的值为 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="nu12">0x01020304</span></span></span> 。</p>
|
|
<p>C 中,诸如 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="st0">'a'</span></span></span> 或 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="st0">'<span class="es1">\n</span>'</span></span></span> 之类的字符常量具有 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">int</span></span></span> 类型,而非 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">char</span></span></span>。</p>
|
|
<h3><span class="mw-headline" id=".E7.A4.BA.E4.BE.8B">示例</span></h3>
|
|
<div class="t-example">
|
|
<div class="t-example-live-link"></div>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="cpp source-cpp">
|
|
<pre class="de1"><span class="co2">#include <cstdint></span>
|
|
<span class="co2">#include <iomanip></span>
|
|
<span class="co2">#include <iostream></span>
|
|
<span class="co2">#include <string_view></span>
|
|
|
|
<span class="kw1">template</span> <span class="sy1"><</span><span class="kw1">typename</span> CharT<span class="sy1">></span>
|
|
<span class="kw4">void</span> dump<span class="br0">(</span><a href="cpp-string-basic_string_view.html"><span class="kw1248">std::<span class="me2">string_view</span></span></a> s, <span class="kw4">const</span> CharT c<span class="br0">)</span> <span class="br0">{</span>
|
|
<span class="kw4">const</span> uint8_t<span class="sy2">*</span> data <span class="br0">{</span><span class="kw1">reinterpret_cast</span><span class="sy1"><</span><span class="kw4">const</span> uint8_t<span class="sy2">*</span><span class="sy1">></span><span class="br0">(</span><span class="sy3">&</span>c<span class="br0">)</span><span class="br0">}</span><span class="sy4">;</span>
|
|
<a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> <span class="st0">"'"</span> <span class="sy1"><<</span> s <span class="sy1"><<</span> <span class="st0">"' <span class="es1">\t</span>"</span> <span class="sy1"><<</span> <a href="cpp-io-manip-hex.html"><span class="kw1782">std::<span class="me2">hex</span></span></a>
|
|
<span class="sy1"><<</span> <a href="cpp-io-manip-uppercase.html"><span class="kw1774">std::<span class="me2">uppercase</span></span></a> <span class="sy1"><<</span> <a href="cpp-io-manip-setfill.html"><span class="kw1795">std::<span class="me2">setfill</span></span></a><span class="br0">(</span><span class="st0">'0'</span><span class="br0">)</span><span class="sy4">;</span>
|
|
<span class="kw1">for</span> <span class="br0">(</span><span class="kw4">auto</span> i <span class="br0">{</span>0U<span class="br0">}</span><span class="sy4">;</span> i <span class="sy3">!</span><span class="sy1">=</span> sizeof<span class="br0">(</span>CharT<span class="br0">)</span><span class="sy4">;</span> <span class="sy2">++</span>i<span class="br0">)</span><span class="br0">{</span>
|
|
<a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> <a href="cpp-io-manip-setw.html"><span class="kw1797">std::<span class="me2">setw</span></span></a><span class="br0">(</span><span class="nu0">2</span><span class="br0">)</span> <span class="sy1"><<</span> <span class="kw1">static_cast</span><span class="sy1"><</span><span class="kw4">unsigned</span><span class="sy1">></span><span class="br0">(</span>data<span class="br0">[</span>i<span class="br0">]</span><span class="br0">)</span> <span class="sy1"><<</span> <span class="st0">' '</span><span class="sy4">;</span>
|
|
<span class="br0">}</span>
|
|
<a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span><span class="sy4">;</span>
|
|
<span class="br0">}</span>
|
|
|
|
<span class="kw4">void</span> print<span class="br0">(</span><a href="cpp-string-basic_string_view.html"><span class="kw1248">std::<span class="me2">string_view</span></span></a> str<span class="br0">)</span> <span class="br0">{</span> <a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> str<span class="sy4">;</span> <span class="br0">}</span>
|
|
|
|
<span class="kw4">int</span> main<span class="br0">(</span><span class="br0">)</span>
|
|
<span class="br0">{</span>
|
|
print<span class="br0">(</span><span class="st0">"字面量十六进制转储 <span class="es1">\n</span>"</span>
|
|
<span class="st0">"─────── ───────────<span class="es1">\n</span>"</span><span class="br0">)</span><span class="sy4">;</span>
|
|
|
|
dump<span class="br0">(</span><span class="st0">"a"</span>, <span class="st0">'a'</span><span class="br0">)</span><span class="sy4">;</span>
|
|
dump<span class="br0">(</span><span class="st0">"🍌"</span>, <span class="st0">'🍌'</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// 实现定义</span>
|
|
print<span class="br0">(</span><span class="st0">"<span class="es1">\n</span>"</span><span class="br0">)</span><span class="sy4">;</span>
|
|
|
|
<span class="co1">// 通常多字符字面量</span>
|
|
dump<span class="br0">(</span><span class="st0">"ab"</span>, <span class="st0">'ab'</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// 实现定义</span>
|
|
print<span class="br0">(</span><span class="st0">"<span class="es1">\n</span>"</span><span class="br0">)</span><span class="sy4">;</span>
|
|
|
|
<span class="co1">// UTF-16 字符字面量</span>
|
|
<span class="kw4">char16_t</span> uc1 <span class="sy1">=</span> u<span class="st0">'a'</span><span class="sy4">;</span> dump<span class="br0">(</span><span class="st0">"a"</span>, uc1<span class="br0">)</span><span class="sy4">;</span>
|
|
<span class="kw4">char16_t</span> uc2 <span class="sy1">=</span> u<span class="st0">'¢'</span><span class="sy4">;</span> dump<span class="br0">(</span><span class="st0">"¢"</span>, uc2<span class="br0">)</span><span class="sy4">;</span>
|
|
<span class="kw4">char16_t</span> uc3 <span class="sy1">=</span> u<span class="st0">'猫'</span><span class="sy4">;</span> dump<span class="br0">(</span><span class="st0">"猫"</span>, uc3<span class="br0">)</span><span class="sy4">;</span>
|
|
<span class="co1">// char16_t uc4 = u'🍌'; dump("🍌", uc4); // 错误: 🍌 映射到两个 UTF-16 编码单元</span>
|
|
print<span class="br0">(</span><span class="st0">"<span class="es1">\n</span>"</span><span class="br0">)</span><span class="sy4">;</span>
|
|
|
|
<span class="co1">// UTF-32 字符字面量</span>
|
|
<span class="kw4">char32_t</span> Uc1 <span class="sy1">=</span> U<span class="st0">'a'</span><span class="sy4">;</span> dump<span class="br0">(</span><span class="st0">"a"</span>, Uc1<span class="br0">)</span><span class="sy4">;</span>
|
|
<span class="kw4">char32_t</span> Uc2 <span class="sy1">=</span> U<span class="st0">'¢'</span><span class="sy4">;</span> dump<span class="br0">(</span><span class="st0">"¢"</span>, Uc2<span class="br0">)</span><span class="sy4">;</span>
|
|
<span class="kw4">char32_t</span> Uc3 <span class="sy1">=</span> U<span class="st0">'猫'</span><span class="sy4">;</span> dump<span class="br0">(</span><span class="st0">"猫"</span>, Uc3<span class="br0">)</span><span class="sy4">;</span>
|
|
<span class="kw4">char32_t</span> Uc4 <span class="sy1">=</span> U<span class="st0">'🍌'</span><span class="sy4">;</span> dump<span class="br0">(</span><span class="st0">"🍌"</span>, Uc4<span class="br0">)</span><span class="sy4">;</span>
|
|
print<span class="br0">(</span><span class="st0">"<span class="es1">\n</span>"</span><span class="br0">)</span><span class="sy4">;</span>
|
|
|
|
<span class="co1">// 宽字符字面量</span>
|
|
<span class="kw4">wchar_t</span> wc1 <span class="sy1">=</span> L<span class="st0">'a'</span><span class="sy4">;</span> dump<span class="br0">(</span><span class="st0">"a"</span>, wc1<span class="br0">)</span><span class="sy4">;</span>
|
|
<span class="kw4">wchar_t</span> wc2 <span class="sy1">=</span> L<span class="st0">'¢'</span><span class="sy4">;</span> dump<span class="br0">(</span><span class="st0">"¢"</span>, wc2<span class="br0">)</span><span class="sy4">;</span>
|
|
<span class="kw4">wchar_t</span> wc3 <span class="sy1">=</span> L<span class="st0">'猫'</span><span class="sy4">;</span> dump<span class="br0">(</span><span class="st0">"猫"</span>, wc3<span class="br0">)</span><span class="sy4">;</span>
|
|
<span class="kw4">wchar_t</span> wc4 <span class="sy1">=</span> L<span class="st0">'🍌'</span><span class="sy4">;</span> dump<span class="br0">(</span><span class="st0">"🍌"</span>, wc4<span class="br0">)</span><span class="sy4">;</span>
|
|
<span class="br0">}</span></pre></div>
|
|
</div>
|
|
<p>可能的输出:</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="text source-text">
|
|
<pre class="de1">字面量十六进制转储
|
|
─────── ───────────
|
|
'a' 61
|
|
'🍌' 8C 8D 9F F0
|
|
|
|
'ab' 62 61 00 00
|
|
|
|
'a' 61 00
|
|
'¢' A2 00
|
|
'猫' 2B 73
|
|
|
|
'a' 61 00 00 00
|
|
'¢' A2 00 00 00
|
|
'猫' 2B 73 00 00
|
|
'🍌' 4C F3 01 00
|
|
|
|
'a' 61 00 00 00
|
|
'¢' A2 00 00 00
|
|
'猫' 2B 73 00 00
|
|
'🍌' 4C F3 01 00</pre></div>
|
|
</div>
|
|
</div>
|
|
<h3><span class="mw-headline" id=".E7.BC.BA.E9.99.B7.E6.8A.A5.E5.91.8A">缺陷报告</span></h3>
|
|
<p>下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。</p>
|
|
<table class="dsctable" style="font-size:0.8em">
|
|
<tr>
|
|
<th>DR</th>
|
|
<th>应用于</th>
|
|
<th>出版时的行为</th>
|
|
<th>正确行为</th>
|
|
</tr>
|
|
<tr>
|
|
<td><a rel="nofollow" class="external text" href="https://wg21.cmeerw.net/cwg/issue912">CWG 912</a></td>
|
|
<td>C++98</td>
|
|
<td>未指明不可编码的通常字符字面量</td>
|
|
<td>指定为条件性支持</td>
|
|
</tr>
|
|
<tr>
|
|
<td><a rel="nofollow" class="external text" href="https://wg21.cmeerw.net/cwg/issue1024">CWG 1024</a></td>
|
|
<td>C++98</td>
|
|
<td>要求支持多字符字面量</td>
|
|
<td>改为条件性支持</td>
|
|
</tr>
|
|
<tr>
|
|
<td><a rel="nofollow" class="external text" href="https://wg21.cmeerw.net/cwg/issue1656">CWG 1656</a></td>
|
|
<td>C++98</td>
|
|
<td>字符字面量中的数值转义序列的含义不明确</td>
|
|
<td>已指定</td>
|
|
</tr>
|
|
</table>
|
|
<h3><span class="mw-headline" id=".E5.8F.82.E9.98.85">参阅</span></h3>
|
|
<table class="t-dsc-begin">
|
|
<tr class="t-dsc">
|
|
<td><a href="cpp-language-user_literal.html">用户定义字面量</a><span class="t-mark-rev t-since-cxx11">(C++11)</span></td>
|
|
<td>拥有用户定义后缀的字面量</td>
|
|
</tr>
|
|
</table>
|
|
</div>
|
|
<div class="visualClear"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|