235 lines
24 KiB
HTML
235 lines
24 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-c_language_character_constant 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="c.html">c</a>‎ | <a href="c-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-char</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> <code><b>'</b></code> <span class="t-spar">c-char</span> <code><b>'</b></code></td>
|
|
<td>(2)</td>
|
|
<td><span class="t-mark-rev t-since-c23">(C23 起)</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td><code><b>u</b></code> <code><b>'</b></code> <span class="t-spar">c-char</span> <code><b>'</b></code></td>
|
|
<td>(3)</td>
|
|
<td><span class="t-mark-rev t-since-c11">(C11 起)</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td><code><b>U</b></code> <code><b>'</b></code> <span class="t-spar">c-char</span> <code><b>'</b></code></td>
|
|
<td>(4)</td>
|
|
<td><span class="t-mark-rev t-since-c11">(C11 起)</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td><code><b>L</b></code> <code><b>'</b></code> <span class="t-spar">c-char</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-char-sequence</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>
|
|
</table>
|
|
<p>其中</p>
|
|
<ul>
|
|
<li><span class="t-spar">c-char</span> 是以下之一</li>
|
|
</ul>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>来自基本源字符集减去单引号( <code><b>'</b></code> )、反斜杠( <code><b>\</b></code> )或换行符的字符。</li>
|
|
<li>转义序列:特殊字符转义 <span class="t-c"><span class="mw-geshi c source-c">\<span class="st0">'</span></span></span> <span class="t-c"><span class="mw-geshi c source-c">\<span class="st0">"</span></span></span> <span class="t-c"><span class="mw-geshi c source-c">\<span class="sy4">?</span></span></span> <span class="t-c"><span class="mw-geshi c source-c">\\</span></span> <span class="t-c"><span class="mw-geshi c source-c">\a</span></span> <span class="t-c"><span class="mw-geshi c source-c">\b</span></span> <span class="t-c"><span class="mw-geshi c source-c">\f</span></span> <span class="t-c"><span class="mw-geshi c source-c">\n</span></span> <span class="t-c"><span class="mw-geshi c source-c">\r</span></span> <span class="t-c"><span class="mw-geshi c source-c">\t</span></span> <span class="t-c"><span class="mw-geshi c source-c">\v</span></span> 、十六进制转义 <span class="t-c"><span class="mw-geshi c source-c">\x...</span></span> 或八进制转义 <span class="t-c"><span class="mw-geshi c source-c">\...</span></span> 之一,如<a href="c-language-escape.html">转义序列</a>中所定义。</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-since-c99">
|
|
<td>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>通用字符名, <span class="t-c"><span class="mw-geshi c source-c">\u...</span></span> 或 <span class="t-c"><span class="mw-geshi c source-c">\U...</span></span> ,如<a href="c-language-escape.html">转义序列</a>中所定义。</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-c99">(C99 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
<ul>
|
|
<li><span class="t-spar">c-char-sequence</span> 为二个或更多 <span class="t-spar">c-char</span> 的序列。</li>
|
|
</ul>
|
|
<div class="t-li1"><span class="t-li">1)</span> 单字节整数字符常量,例如 <span class="t-c"><span class="mw-geshi c source-c"><span class="st0">'a'</span></span></span> 或 <span class="t-c"><span class="mw-geshi c source-c"><span class="st0">'<span class="es1">\n</span>'</span></span></span> 或 <span class="t-c"><span class="mw-geshi c source-c"><span class="st0">'<span class="es5">\13</span>'</span></span></span> 。这种常量拥有 <span class="t-c"><span class="mw-geshi c source-c"><span class="kw4">int</span></span></span> 类型,和等于 <span class="t-spar">c-char</span> 在执行字符集中作为映射到 <span class="t-c"><span class="mw-geshi c source-c"><span class="kw4">int</span></span></span> 的 <span class="t-c"><span class="mw-geshi c source-c"><span class="kw4">char</span></span></span> 类型值的值。若 <span class="t-spar">c-char</span> 不能表示成执行字符集中的单字节,则值是实现定义的。</div>
|
|
<div class="t-li1"><span class="t-li">2)</span> UTF-8 字符常量,例如 <span class="t-c"><span class="mw-geshi c source-c">u8<span class="st0">'a'</span></span></span> 。这种常量拥有 <span class="t-c"><span class="mw-geshi c source-c"><span class="kw4">unsigned</span> <span class="kw4">char</span></span></span> 类型和等于 <span class="t-spar">c-char</span> 的 ISO 10646 码位值的值,只要该码位值能以单个 UTF-8 编码单元表示(即 <span class="t-spar">c-char</span> 在含上下界的范围 0x0-0x7F 内)。若 <span class="t-spar">c-char</span> 不可表示为单个 UTF-8 编码单元,则程序为非良构。</div>
|
|
<div class="t-li1"><span class="t-li">2)</span> 16 位宽字符常量,例如 <span class="t-c"><span class="mw-geshi c source-c">u<span class="st0">'字'</span></span></span> 但非 <span class="t-c"><span class="mw-geshi c source-c">u<span class="st0">'🍌'</span></span></span> ( <span class="t-c"><span class="mw-geshi c source-c">u<span class="st0">'<span class="es4">\U0001f34c</span>'</span></span></span> )。这种常量拥有 <span class="t-c"><span class="mw-geshi c source-c">char16_t</span></span> 类型,和等于 <span class="t-lc"><a href="c-string-multibyte-mbrtoc16.html">mbrtoc16</a></span> 所产生的 <span class="t-spar">c-char</span> 于 16 位编码(通常为 UTF-16 )中值的值。若 <span class="t-spar">c-char</span> 不能表示为,或映射到多于一个 16 位字符,则值是实现定义的。</div>
|
|
<div class="t-li1"><span class="t-li">3)</span> 32 位宽字符常量,例如 <span class="t-c"><span class="mw-geshi c source-c">U<span class="st0">'字'</span></span></span> 或 <span class="t-c"><span class="mw-geshi c source-c">U<span class="st0">'🍌'</span></span></span> 。这种常量拥有 <span class="t-c"><span class="mw-geshi c source-c">char32_t</span></span> 类型,和等于 <span class="t-lc"><a href="c-string-multibyte-mbrtoc32.html">mbrtoc32</a></span> 所产生的 <span class="t-spar">c-char</span> 于 32 位编码(通常为 UTF-32 )中值的值。若 <span class="t-spar">c-char</span> 不能表示为,或映射到多于一个 32 位字符,则值是实现定义的。</div>
|
|
<div class="t-li1"><span class="t-li">4)</span> 宽字符常量,例如 <span class="t-c"><span class="mw-geshi c source-c">L<span class="st0">'β'</span></span></span> 或 <span class="t-c"><span class="mw-geshi c source-c">L<span class="st0">'字'</span></span></span> 。这种常量拥有 <span class="t-c"><span class="mw-geshi c source-c"><span class="kw4">wchar_t</span></span></span> 类型,和等于 <span class="t-spar">c-char</span> 在执行宽字符集中的值的值(即 <span class="t-lc"><a href="c-string-multibyte-mbtowc.html">mbtowc</a></span> 会产生的值)。若 <span class="t-spar">c-char</span> 不能表示为或映射到多于一个宽字符(例如 Windows 上的非 BMP 值,其中 <span class="t-c"><span class="mw-geshi c source-c"><span class="kw4">wchar_t</span></span></span> 为 16 位),则值是实现定义的。</div>
|
|
<div class="t-li1"><span class="t-li">5)</span> 多字符常量,例如 <span class="t-c"><span class="mw-geshi c source-c"><span class="st0">'AB'</span></span></span> 拥有 <span class="t-c"><span class="mw-geshi c source-c"><span class="kw4">int</span></span></span> 类型和实现定义值。</div>
|
|
<h3><span class="mw-headline" id=".E6.B3.A8.E8.A7.A3">注解</span></h3>
|
|
<p>多字符常量是 C 从 B 编程语言继承而来的。尽管 C 标准不指定,大多数编译器(值得注意的例外是 MSVC )也如 B 中所指定实现多字符常量:常量中的每个字符的值以大端序零填充右对齐顺序初始化结果整数的相继字节,例如 <span class="t-c"><span class="mw-geshi c source-c"><span class="st0">'<span class="es5">\1</span>'</span></span></span> 的值为 <span class="t-c"><span class="mw-geshi c source-c"><span class="nu12">0x00000001</span></span></span> 而 <span class="t-c"><span class="mw-geshi c source-c"><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 c source-c"><span class="nu12">0x01020304</span></span></span> 。</p>
|
|
<p>C++ 中,可编码的通常字符字面量拥有 <span class="t-c"><span class="mw-geshi c source-c"><span class="kw4">char</span></span></span> 类型,而非 <span class="t-c"><span class="mw-geshi c source-c"><span class="kw4">int</span></span></span> 。</p>
|
|
<p>不同于<a href="c-language-integer_constant.html">整数常量</a>,若 <span class="t-c"><span class="mw-geshi c source-c"><span class="kw4">char</span></span></span> 有符号,则字符常量可以有负值:这种实现中 <span class="t-c"><span class="mw-geshi c source-c"><span class="st0">'<span class="es2">\xFF</span>'</span></span></span> 是拥有值 <span class="t-c"><span class="mw-geshi c source-c"><span class="sy2">-</span><span class="nu0">1</span></span></span> 的 <span class="t-c"><span class="mw-geshi c source-c"><span class="kw4">int</span></span></span> 。</p>
|
|
<p>用于 <a href="c-preprocessor-conditional.html"><tt>#if</tt></a> 或 <a href="c-preprocessor-conditional.html"><tt>#elif</tt></a> 控制表达式时,可能按照源字符集、执行字符集或其他实现定义的字符集转译字符常量。</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="c source-c">
|
|
<pre class="de1"><span class="co2">#include <stddef.h></span>
|
|
<span class="co2">#include <stdio.h></span>
|
|
<span class="co2">#include <uchar.h></span>
|
|
|
|
<span class="kw4">int</span> main <span class="br0">(</span><span class="kw4">void</span><span class="br0">)</span>
|
|
<span class="br0">{</span>
|
|
<a href="c-io-fprintf.html"><span class="kw851">printf</span></a><span class="br0">(</span><span class="st0">"constant value <span class="es1">\n</span>"</span><span class="br0">)</span><span class="sy4">;</span>
|
|
<a href="c-io-fprintf.html"><span class="kw851">printf</span></a><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">int</span> c1<span class="sy1">=</span><span class="st0">'a'</span><span class="sy4">;</span> <a href="c-io-fprintf.html"><span class="kw851">printf</span></a><span class="br0">(</span><span class="st0">"'a': %#010x<span class="es1">\n</span>"</span>, c1<span class="br0">)</span><span class="sy4">;</span>
|
|
<span class="kw4">int</span> c2<span class="sy1">=</span><span class="st0">'🍌'</span><span class="sy4">;</span> <a href="c-io-fprintf.html"><span class="kw851">printf</span></a><span class="br0">(</span><span class="st0">"'🍌': %#010x<span class="es1">\n</span><span class="es1">\n</span>"</span>, c2<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// 实现定义</span>
|
|
|
|
<span class="co1">// 多字符常量</span>
|
|
<span class="kw4">int</span> c3<span class="sy1">=</span><span class="st0">'ab'</span><span class="sy4">;</span> <a href="c-io-fprintf.html"><span class="kw851">printf</span></a><span class="br0">(</span><span class="st0">"'ab': %#010x<span class="es1">\n</span><span class="es1">\n</span>"</span>, c3<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// 实现定义</span>
|
|
|
|
<span class="co1">// 16 位宽字符常量</span>
|
|
char16_t uc1 <span class="sy1">=</span> u<span class="st0">'a'</span><span class="sy4">;</span> <a href="c-io-fprintf.html"><span class="kw851">printf</span></a><span class="br0">(</span><span class="st0">"'a': %#010x<span class="es1">\n</span>"</span>, <span class="br0">(</span><span class="kw4">int</span><span class="br0">)</span>uc1<span class="br0">)</span><span class="sy4">;</span>
|
|
char16_t uc2 <span class="sy1">=</span> u<span class="st0">'¢'</span><span class="sy4">;</span> <a href="c-io-fprintf.html"><span class="kw851">printf</span></a><span class="br0">(</span><span class="st0">"'¢': %#010x<span class="es1">\n</span>"</span>, <span class="br0">(</span><span class="kw4">int</span><span class="br0">)</span>uc2<span class="br0">)</span><span class="sy4">;</span>
|
|
char16_t uc3 <span class="sy1">=</span> u<span class="st0">'猫'</span><span class="sy4">;</span> <a href="c-io-fprintf.html"><span class="kw851">printf</span></a><span class="br0">(</span><span class="st0">"'猫': %#010x<span class="es1">\n</span>"</span>, <span class="br0">(</span><span class="kw4">int</span><span class="br0">)</span>uc3<span class="br0">)</span><span class="sy4">;</span>
|
|
<span class="co1">// 实现定义( 🍌 映射到二个 16 位宽字符)</span>
|
|
char16_t uc4 <span class="sy1">=</span> u<span class="st0">'🍌'</span><span class="sy4">;</span> <a href="c-io-fprintf.html"><span class="kw851">printf</span></a><span class="br0">(</span><span class="st0">"'🍌': %#010x<span class="es1">\n</span><span class="es1">\n</span>"</span>, <span class="br0">(</span><span class="kw4">int</span><span class="br0">)</span>uc4<span class="br0">)</span><span class="sy4">;</span>
|
|
|
|
<span class="co1">// 32 位宽字符常量</span>
|
|
char32_t Uc1 <span class="sy1">=</span> U<span class="st0">'a'</span><span class="sy4">;</span> <a href="c-io-fprintf.html"><span class="kw851">printf</span></a><span class="br0">(</span><span class="st0">"'a': %#010x<span class="es1">\n</span>"</span>, <span class="br0">(</span><span class="kw4">int</span><span class="br0">)</span>Uc1<span class="br0">)</span><span class="sy4">;</span>
|
|
char32_t Uc2 <span class="sy1">=</span> U<span class="st0">'¢'</span><span class="sy4">;</span> <a href="c-io-fprintf.html"><span class="kw851">printf</span></a><span class="br0">(</span><span class="st0">"'¢': %#010x<span class="es1">\n</span>"</span>, <span class="br0">(</span><span class="kw4">int</span><span class="br0">)</span>Uc2<span class="br0">)</span><span class="sy4">;</span>
|
|
char32_t Uc3 <span class="sy1">=</span> U<span class="st0">'猫'</span><span class="sy4">;</span> <a href="c-io-fprintf.html"><span class="kw851">printf</span></a><span class="br0">(</span><span class="st0">"'猫': %#010x<span class="es1">\n</span>"</span>, <span class="br0">(</span><span class="kw4">int</span><span class="br0">)</span>Uc3<span class="br0">)</span><span class="sy4">;</span>
|
|
char32_t Uc4 <span class="sy1">=</span> U<span class="st0">'🍌'</span><span class="sy4">;</span> <a href="c-io-fprintf.html"><span class="kw851">printf</span></a><span class="br0">(</span><span class="st0">"'🍌': %#010x<span class="es1">\n</span><span class="es1">\n</span>"</span>, <span class="br0">(</span><span class="kw4">int</span><span class="br0">)</span>Uc4<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> <a href="c-io-fprintf.html"><span class="kw851">printf</span></a><span class="br0">(</span><span class="st0">"'a': %#010x<span class="es1">\n</span>"</span>, <span class="br0">(</span><span class="kw4">int</span><span class="br0">)</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> <a href="c-io-fprintf.html"><span class="kw851">printf</span></a><span class="br0">(</span><span class="st0">"'¢': %#010x<span class="es1">\n</span>"</span>, <span class="br0">(</span><span class="kw4">int</span><span class="br0">)</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> <a href="c-io-fprintf.html"><span class="kw851">printf</span></a><span class="br0">(</span><span class="st0">"'猫': %#010x<span class="es1">\n</span>"</span>, <span class="br0">(</span><span class="kw4">int</span><span class="br0">)</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> <a href="c-io-fprintf.html"><span class="kw851">printf</span></a><span class="br0">(</span><span class="st0">"'🍌': %#010x<span class="es1">\n</span><span class="es1">\n</span>"</span>, <span class="br0">(</span><span class="kw4">int</span><span class="br0">)</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">constant value
|
|
-------- ----------
|
|
'a': 0x00000061
|
|
'🍌': 0xf09f8d8c
|
|
|
|
'ab': 0x00006162
|
|
|
|
'a': 0x00000061
|
|
'¢': 0x000000a2
|
|
'猫': 0x0000732b
|
|
'🍌': 0x0000df4c
|
|
|
|
'a': 0x00000061
|
|
'¢': 0x000000a2
|
|
'猫': 0x0000732b
|
|
'🍌': 0x0001f34c
|
|
|
|
'a': 0x00000061
|
|
'¢': 0x000000a2
|
|
'猫': 0x0000732b
|
|
'🍌': 0x0001f34c</pre></div>
|
|
</div>
|
|
</div>
|
|
<h3><span class="mw-headline" id=".E5.BC.95.E7.94.A8">引用</span></h3>
|
|
<div class="t-ref-std-17">
|
|
<ul>
|
|
<li>C17 标准(ISO/IEC 9899:2018):</li>
|
|
</ul>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>6.4.4.4 Character constants (p: 48-50)</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
</div>
|
|
<div class="t-ref-std-11">
|
|
<ul>
|
|
<li>C11 标准(ISO/IEC 9899:2011):</li>
|
|
</ul>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>6.4.4.4 Character constants (p: 67-70)</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
</div>
|
|
<div class="t-ref-std-c99">
|
|
<ul>
|
|
<li>C99 标准(ISO/IEC 9899:1999):</li>
|
|
</ul>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>6.4.4.4 Character constants (p: 59-61)</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
</div>
|
|
<div class="t-ref-std-c89">
|
|
<ul>
|
|
<li>C89/C90 标准(ISO/IEC 9899:1990):</li>
|
|
</ul>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>3.1.3.4 Character constants</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
</div>
|
|
<h3><span class="mw-headline" id=".E5.8F.82.E9.98.85">参阅</span></h3>
|
|
<table class="t-dsc-begin"></table>
|
|
</div>
|
|
<div class="visualClear"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|