204 lines
18 KiB
HTML
204 lines
18 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_escape 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">
|
|
<p>转义序列用于在<a href="cpp-language-string_literal.html">字符串字面量</a>和<a href="cpp-language-character_literal.html">字符字面量</a>中表示某些特殊字符。</p>
|
|
<p>可以使用下列转义序列:</p>
|
|
<table class="wikitable">
|
|
<tr>
|
|
<th>转义序列</th>
|
|
<th>描述</th>
|
|
<th>表示</th>
|
|
</tr>
|
|
<tr>
|
|
<th colspan="3">简单转义序列</th>
|
|
</tr>
|
|
<tr>
|
|
<td><code><b>\'</b></code></td>
|
|
<td>单引号</td>
|
|
<td>ASCII 编码中为字节 <code>0x27</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code><b>\"</b></code></td>
|
|
<td>双引号</td>
|
|
<td>ASCII 编码中为字节 <code>0x22</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code><b>\?</b></code></td>
|
|
<td>问号</td>
|
|
<td>ASCII 编码中为字节 <code>0x3f</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code><b>\\</b></code></td>
|
|
<td>反斜杠</td>
|
|
<td>ASCII 编码中为字节 <code>0x5c</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code><b>\a</b></code></td>
|
|
<td>响铃</td>
|
|
<td>ASCII 编码中为字节 <code>0x07</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code><b>\b</b></code></td>
|
|
<td>退格</td>
|
|
<td>ASCII 编码中为字节 <code>0x08</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code><b>\f</b></code></td>
|
|
<td>换页</td>
|
|
<td>ASCII 编码中为字节 <code>0x0c</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code><b>\n</b></code></td>
|
|
<td>换行</td>
|
|
<td>ASCII 编码中为字节 <code>0x0a</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code><b>\r</b></code></td>
|
|
<td>回车</td>
|
|
<td>ASCII 编码中为字节 <code>0x0d</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code><b>\t</b></code></td>
|
|
<td>水平制表</td>
|
|
<td>ASCII 编码中为字节 <code>0x09</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code><b>\v</b></code></td>
|
|
<td>垂直制表</td>
|
|
<td>ASCII 编码中为字节 <code>0x0b</code></td>
|
|
</tr>
|
|
<tr>
|
|
<th colspan="3">数值转义序列</th>
|
|
</tr>
|
|
<tr>
|
|
<td><code><b>\<span style="font-size:0.7em; line-height:130%"><i>nnn</i></span></b></code></td>
|
|
<td>任意八进制值</td>
|
|
<td>字节 <code><i>nnn</i></code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code><b>\x<span style="font-size:0.7em; line-height:130%"><i>nn</i></span></b></code></td>
|
|
<td>任意十六进制值</td>
|
|
<td>字节 <code><i>nn</i></code></td>
|
|
</tr>
|
|
<tr>
|
|
<th colspan="3">条件转义序列<sup id="cite_ref-1" class="reference"><a href="cpp-language-escape.html#cite_note-1">[1]</a></sup></th>
|
|
</tr>
|
|
<tr>
|
|
<td><code><b>\<span style="font-size:0.7em; line-height:130%"><i>c</i></span></b></code></td>
|
|
<td>实现定义</td>
|
|
<td>实现定义</td>
|
|
</tr>
|
|
<tr>
|
|
<th colspan="3">通用字符名</th>
|
|
</tr>
|
|
<tr>
|
|
<td><code>\u<span style="font-size:0.7em; line-height:130%"><i>nnnn</i></span></code></td>
|
|
<td>任意 <a href="https://en.wikipedia.org/wiki/Unicode" class="extiw" title="enwiki:Unicode">Unicode</a> 值:<br />
|
|
可能生成多个编码单元</td>
|
|
<td>编码点 <code>U+<i>nnnn</i></code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>\U<span style="font-size:0.7em; line-height:130%"><i>nnnnnnnn</i></span></code></td>
|
|
<td>任意 <a href="https://en.wikipedia.org/wiki/Unicode" class="extiw" title="enwiki:Unicode">Unicode</a> 值:<br />
|
|
可能生成多个编码单元</td>
|
|
<td>编码点 <code>U+<i>nnnnnnnn</i></code></td>
|
|
</tr>
|
|
</table>
|
|
<ol class="references">
|
|
<li id="cite_note-1"><span class="mw-cite-backlink"><a href="cpp-language-escape.html#cite_ref-1">↑</a></span> <span class="reference-text">条件转义序列受条件性支持。每个条件转义序列中的字符 <code><b><span style="font-size:0.7em; line-height:130%"><i>c</i></span></b></code> 都是<span class="t-rev-inl t-until-cxx23"><span><a href="cpp-language-charset.html#.E5.9F.BA.E7.A1.80.E6.BA.90.E5.AD.97.E7.AC.A6.E9.9B.86">基础源字符集</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#.E5.9F.BA.E7.A1.80.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> 的字符。</span></li>
|
|
</ol>
|
|
<h3><span class="mw-headline" id=".E9.80.9A.E7.94.A8.E5.AD.97.E7.AC.A6.E5.90.8D.E7.9A.84.E8.8C.83.E5.9B.B4">通用字符名的范围</span></h3>
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-until-cxx11">
|
|
<td>
|
|
<p>如果有一个通用字符名对应了一个小于 0xA0 且不是 0x24 (<code>$</code>)、 0x40 (<code>@</code>) 或 0x60 (<code>`</code>) 的码位,那么程序为谬构。换言之,通用字符名不能表达<a href="cpp-language-charset.html#.E5.9F.BA.E7.A1.80.E6.BA.90.E5.AD.97.E7.AC.A6.E9.9B.86">基础源字符集</a>的成员与控制字符(范围为 0x0-0x1F 及 0x7F-0x9F)。</p>
|
|
</td>
|
|
<td><span class="t-mark-rev t-until-cxx11">(C++11 前)</span></td>
|
|
</tr>
|
|
<tr class="t-rev t-since-cxx11 t-until-cxx20">
|
|
<td>
|
|
<p>如果在<a href="cpp-language-character_literal.html">字符</a>和<a href="cpp-language-string_literal.html">字符串字面量</a>以外有一个通用字符名对应了一个<a href="cpp-language-charset.html#.E5.9F.BA.E7.A1.80.E6.BA.90.E5.AD.97.E7.AC.A6.E9.9B.86">基础源字符集</a>的成员或控制字符的码位,那么程序为谬构。</p>
|
|
<p>如果有一个通用字符名对应了一个代理码位(范围 0xD800-0xDFFF,含两端),那么程序为谬构。</p>
|
|
<p>如果有一个用于 UTF-16/32 <a href="cpp-language-string_literal.html">字符串字面量</a>的通用字符名不对应 ISO/IEC 10646 中的任何码位(范围 0x0-0x10FFFF,含两端)那么程序为谬构。</p>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-cxx11">(C++11 起)</span><br />
|
|
<span class="t-mark-rev t-until-cxx20">(C++20 前)</span></td>
|
|
</tr>
|
|
<tr class="t-rev t-since-cxx20 t-until-cxx23">
|
|
<td>
|
|
<p>如果在<a href="cpp-language-character_literal.html">字符</a>和<a href="cpp-language-string_literal.html">字符串字面量</a>以外有一个通用字符名对应了一个<a href="cpp-language-charset.html#.E5.9F.BA.E7.A1.80.E6.BA.90.E5.AD.97.E7.AC.A6.E9.9B.86">基础源字符集</a>的成员或控制字符的码位,那么程序为谬构。</p>
|
|
<p>如果有一个通用字符名不对应 ISO/IEC 10646 中的任何码位(范围 0x0-0x10FFFF,含两端)或对应了一个代理码位(范围 0xD800-0xDFFF,含两端),那么程序为谬构。</p>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-cxx20">(C++20 起)</span><br />
|
|
<span class="t-mark-rev t-until-cxx23">(C++23 前)</span></td>
|
|
</tr>
|
|
<tr class="t-rev t-since-cxx23">
|
|
<td>
|
|
<p>如果在<a href="cpp-language-character_literal.html">字符</a>和<a href="cpp-language-string_literal.html">字符串字面量</a>以外有一个通用字符名对应了一个<a href="cpp-language-charset.html#.E5.9F.BA.E7.A1.80.E5.AD.97.E7.AC.A6.E9.9B.86">基础字符集</a>的字符或控制字符的标量值,那么程序为谬构。</p>
|
|
<p>如果有一个通用字符名不对应<a href="cpp-language-charset.html#.E7.BF.BB.E8.AF.91.E5.AD.97.E7.AC.A6.E9.9B.86">翻译字符集</a>中的任何字符的标量值,那么程序为谬构。</p>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-cxx23">(C++23 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
<h3><span class="mw-headline" id=".E6.B3.A8.E8.A7.A3">注解</span></h3>
|
|
<p><code><b>\0</b></code> 在八进制转义序列中最常用,因为它表示<a href="cpp-string.html#.E7.A9.BA.E7.BB.88.E6.AD.A2.E5.AD.97.E7.AC.A6.E4.B8.B2">空终止字符串</a>中的空终止字符。</p>
|
|
<p>换行符 <code><b>\n</b></code> 在用于<a href="cpp-io-c.html">文本模式 I/O</a> 时有特殊含义:它被转换为操作系统指定的换行符表示,通常是一个字节或字节序列。某些系统转而用长度字段标记其文本行。</p>
|
|
<p>八进制转义序列具有三个八进制位的长度限制,但如果遇到首个不是合法八进制位的字符,则在此处提前终止。</p>
|
|
<p>十六进制转义序列无长度限制,并在首个不是合法十六进制位的字符处终止。若单个十六进制转义序列所表示的值不适于此字符串字面量或字符常量中使用的字符类型(<span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">char</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-rev-inl t-since-cxx11"><span>、<span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">char16_t</span></span></span>、<span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">char32_t</span></span></span></span> <span><span class="t-mark-rev t-since-cxx11">(C++11 起)</span></span></span> 或 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">wchar_t</span></span></span>),则其结果未指明。</p>
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-since-cxx11">
|
|
<td>
|
|
<p>窄字符串字面量或 16 位字符串字面量中的通用字符名可能映射到多于一个编码单元,例如 <span class="t-c"><span class="mw-geshi cpp source-cpp">\U0001f34c</span></span> 在 UTF-8 中是 4 个 <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">\xF0\x9F\x8D\x8C</span></span>),而在 UTF-16 中是 2 个 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">char16_t</span></span></span> 编码单元(<span class="t-c"><span class="mw-geshi cpp source-cpp">\xD83C\xDF4C</span></span>)。</p>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-cxx11">(C++11 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
<p>问号转义序列 <span class="t-c"><span class="mw-geshi cpp source-cpp">\<span class="sy4">?</span></span></span> 用于阻止在字符串字面量内转译<a href="cpp-language-operator_alternative.html">三标符</a>:如 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="st0">"??/"</span></span></span> 的字符串被编译成 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="st0">"<span class="es1">\"</span></span></span></span>,但若如在 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="st0">"?<span class="es1">\?</span>/"</span></span></span> 中转义第二个问号,则它变为 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="st0">"??/"</span></span></span> 。<span class="t-rev-inl t-since-cxx17"><span>由于三标符已从 C++ 移除,问号转义序列不再有必要。它为与 C++14 (及之前标准版本)及 C 的兼容保留。</span> <span><span class="t-mark-rev t-since-cxx17">(C++17 起)</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 <iostream></span>
|
|
|
|
<span class="kw4">int</span> main<span class="br0">(</span><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> <span class="st0">"这<span class="es1">\n</span>是<span class="es1">\n</span>一个<span class="es1">\n</span>测试<span class="es1">\n</span><span class="es1">\n</span>She said, <span class="es1">\"</span>Sells she seashells on the seashore?<span class="es1">\"</span><span class="es1">\n</span>"</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">这
|
|
是
|
|
一个
|
|
测试
|
|
|
|
She said, "Sells she seashells on the seashore?"</pre></div>
|
|
</div>
|
|
</div>
|
|
<h3><span class="mw-headline" id=".E5.8F.82.E9.98.85">参阅</span></h3>
|
|
<ul>
|
|
<li><a href="cpp-language-ascii.html">ASCII 码表</a></li>
|
|
</ul>
|
|
<table class="t-dsc-begin"></table>
|
|
</div>
|
|
<div class="visualClear"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|