197 lines
15 KiB
HTML
197 lines
15 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_operator_alternative 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>C++(及 C)源代码可以用任何包含 <a href="https://en.wikipedia.org/wiki/ISO_646" class="extiw" title="enwiki:ISO 646">ISO 646:1983</a> 不变字符集的非 ASCII 7 位字符集书写。然而,一些 C++ 运算符及标点要求 ISO 646 编码集外的字符:<code>{, }、[, ]、#、\、^、|、~</code>。为了能够使用不存在一些或全部这些符号的字符编码(例如德语 <a rel="nofollow" class="external text" href="http://de.wikipedia.org/wiki/DIN_66003">DIN 66003</a>),C++ 定义下列由 ISO 646 兼容字符组成的代用写法。</p>
|
|
<h2><span class="mw-headline" id=".E4.BB.A3.E7.94.A8.E8.AE.B0.E5.8F.B7">代用记号</span></h2>
|
|
<p>几个使用非 ISO-646 字符的运算符和其他记号都有代用拼写。在语言的所有方面,各个代用拼写都严格与其首选记号的表现相同,除了其拼写(<a href="cpp-preprocessor-replace.html">字符串化运算符</a>能使拼写可见)。双字母代用记号有时被称为“双标符 (digraphs)”。</p>
|
|
<table class="wikitable">
|
|
<tr>
|
|
<th>首选</th>
|
|
<th>代用</th>
|
|
</tr>
|
|
<tr>
|
|
<td><code>&&</code></td>
|
|
<td><code>and</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>&=</code></td>
|
|
<td><code>and_eq</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>&</code></td>
|
|
<td><code>bitand</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>|</code></td>
|
|
<td><code>bitor</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>~</code></td>
|
|
<td><code>compl</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>!</code></td>
|
|
<td><code>not</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>!=</code></td>
|
|
<td><code>not_eq</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td>||</td>
|
|
<td>or</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>|=</code></td>
|
|
<td><code>or_eq</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>^</code></td>
|
|
<td><code>xor</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>^=</code></td>
|
|
<td><code>xor_eq</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>{</code></td>
|
|
<td><code><%</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>}</code></td>
|
|
<td><code>%></code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>[</code></td>
|
|
<td><code><:</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>]</code></td>
|
|
<td><code>:></code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>#</code></td>
|
|
<td><code>%:</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>##</code></td>
|
|
<td><code>%:%:</code></td>
|
|
</tr>
|
|
</table>
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-since-cxx11">
|
|
<td>
|
|
<p>当分析器遇到字符序列 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="sy1"><</span><span class="sy4">::</span></span></span>,且后继字符既非 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="sy4">:</span></span></span> 亦非 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="sy1">></span></span></span> 时,<span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="sy1"><</span></span></span> 被当做预处理记号本身,而非代用记号 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="sy1"><</span><span class="sy4">:</span></span></span>。从而 <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-container-vector.html"><span class="kw1269">std::<span class="me2">vector</span></span></a><span class="sy1"><</span><span class="sy4">::</span><a href="cpp-string-basic_string.html"><span class="kw1230">std::<span class="me2">string</span></span></a><span class="sy1">></span></span></span> 不会被错误地处理成 <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-container-vector.html"><span class="kw1269">std::<span class="me2">vector</span></span></a><span class="br0">[</span><span class="sy4">:</span><a href="cpp-string-basic_string.html"><span class="kw1230">std::<span class="me2">string</span></span></a><span class="sy1">></span></span></span>。</p>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-cxx11">(C++11 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
<h4><span class="mw-headline" id=".E6.B3.A8.E8.A7.A3">注解</span></h4>
|
|
<p>字符 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="sy3">&</span></span></span> 及 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="sy3">!</span></span></span> 在 ISO-646 下不变,但仍然为使用这些字符的记号提供了代用写法,以便能够适应更加受限的历史字符集。</p>
|
|
<p>没有相等运算符的代用拼写 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="sy1">==</span></span></span> 如 <span class="t-c"><span class="mw-geshi cpp source-cpp">eq</span></span>),因为字符 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="sy1">=</span></span></span> 已在所有受支持字符集中存在。</p>
|
|
<h3><span class="mw-headline" id=".E4.B8.8E_C_.E7.9A.84.E5.85.BC.E5.AE.B9.E6.80.A7">与 C 的兼容性</span></h3>
|
|
<p>C 编程语言中,同样的单词作为宏定义于包含文件 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="sy1"><</span>iso646.<span class="me1">h</span><span class="sy1">></span></span></span> 之中。因为 C++ 中它们内建于语言,故 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="sy1"><</span>iso646.<span class="me1">h</span><span class="sy1">></span></span></span> 的 C++ 版本还有 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="sy1"><</span>ciso646<span class="sy1">></span></span></span> 不定义任何内容。</p>
|
|
<h2><span class="mw-headline" id=".E4.B8.89.E6.A0.87.E7.AC.A6_.28C.2B.2B17_.E4.B8.AD.E7.A7.BB.E9.99.A4.29">三标符 <span class="t-mark-rev t-until-cxx17">(C++17 中移除)</span></span></h2>
|
|
<p>下列三字符组(三标符,trigraph)在<a href="cpp-language-translation_phases.html">辨识注释和字符串字面量之前被分析</a>,而三标符的每次出现被替换为对应的首选字符:</p>
|
|
<table class="wikitable">
|
|
<tr style="text-align: left;">
|
|
<th>首选</th>
|
|
<th>三标符</th>
|
|
</tr>
|
|
<tr>
|
|
<td><code>{</code></td>
|
|
<td><code>??<</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code></code>}</td>
|
|
<td><code>??></code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>[</code></td>
|
|
<td><code>??(</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>]</code></td>
|
|
<td><code>??)</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>#</code></td>
|
|
<td><code>??=</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>\</code></td>
|
|
<td><code>??/</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>^</code></td>
|
|
<td><code>??'</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>|</code></td>
|
|
<td><code>??!</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>~</code></td>
|
|
<td><code>??-</code></td>
|
|
</tr>
|
|
</table>
|
|
<p>因为三标符的处理非常早,所以如 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="co1">// Will the next line be executed?????/</span></span></span> 这样的注释实际上会注释掉下一行,而如 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="st0">"Enter date ??/??/??"</span></span></span> 这样的字符串字面量将被分析为 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="st0">"Enter date <span class="es1">\\</span>??"</span></span></span>。</p>
|
|
<h3><span class="mw-headline" id=".E5.85.B3.E9.94.AE.E8.AF.8D">关键词</span></h3>
|
|
<p><a href="cpp-keyword-and.html"><tt>and</tt></a>, <a href="cpp-keyword-and_eq.html"><tt>and_eq</tt></a>, <a href="cpp-keyword-bitand.html"><tt>bitand</tt></a>, <a href="cpp-keyword-bitor.html"><tt>bitor</tt></a>, <a href="cpp-keyword-compl.html"><tt>compl</tt></a>, <a href="cpp-keyword-not.html"><tt>not</tt></a>, <a href="cpp-keyword-not_eq.html"><tt>not_eq</tt></a>, <a href="cpp-keyword-or.html"><tt>or</tt></a>, <a href="cpp-keyword-or_eq.html"><tt>or_eq</tt></a>, <a href="cpp-keyword-xor.html"><tt>xor</tt></a>, <a href="cpp-keyword-xor_eq.html"><tt>xor_eq</tt></a></p>
|
|
<h3><span class="mw-headline" id=".E7.A4.BA.E4.BE.8B">示例</span></h3>
|
|
<div class="t-example">
|
|
<p>下列示例演示各种代用记号的使用。</p>
|
|
<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="sy2">%</span><span class="sy4">:</span>include <span class="sy1"><</span>iostream<span class="sy1">></span>
|
|
|
|
<span class="kw1">struct</span> X
|
|
<span class="sy1"><</span><span class="sy2">%</span>
|
|
compl X<span class="br0">(</span><span class="br0">)</span> <span class="sy1"><</span><span class="sy2">%%</span><span class="sy1">></span> <span class="co1">// 析构函数</span>
|
|
X<span class="br0">(</span><span class="br0">)</span> <span class="sy1"><</span><span class="sy2">%%</span><span class="sy1">></span>
|
|
X<span class="br0">(</span><span class="kw4">const</span> X bitand<span class="br0">)</span> <span class="sy1">=</span> delete<span class="sy4">;</span> <span class="co1">// 复制构造函数</span>
|
|
|
|
<span class="kw4">bool</span> operator not_eq<span class="br0">(</span><span class="kw4">const</span> X bitand other<span class="br0">)</span>
|
|
<span class="sy1"><</span><span class="sy2">%</span>
|
|
<span class="kw1">return</span> this not_eq bitand other<span class="sy4">;</span>
|
|
<span class="sy2">%</span><span class="sy1">></span>
|
|
<span class="sy2">%</span><span class="sy1">></span><span class="sy4">;</span>
|
|
|
|
<span class="kw4">int</span> main<span class="br0">(</span><span class="kw4">int</span> argc, <span class="kw4">char</span><span class="sy2">*</span> argv<span class="sy1"><</span><span class="sy4">::</span><span class="sy1">></span><span class="br0">)</span>
|
|
<span class="sy1"><</span><span class="sy2">%</span>
|
|
<span class="co1">// 带引用捕获的 lambda</span>
|
|
<span class="kw4">auto</span> greet <span class="sy1">=</span> <span class="sy1"><</span><span class="sy4">:</span>bitand<span class="sy4">:</span><span class="sy1">></span><span class="br0">(</span><span class="kw4">const</span> <span class="kw4">char</span><span class="sy2">*</span> name<span class="br0">)</span>
|
|
<span class="sy1"><</span><span class="sy2">%</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">"Hello "</span> <span class="sy1"><<</span> name
|
|
<span class="sy1"><<</span> <span class="st0">" from "</span> <span class="sy1"><<</span> argv<span class="sy1"><</span><span class="sy4">:</span><span class="nu0">0</span><span class="sy4">:</span><span class="sy1">></span> <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span><span class="sy4">;</span>
|
|
<span class="sy2">%</span><span class="sy1">></span><span class="sy4">;</span>
|
|
|
|
<span class="kw1">if</span> <span class="br0">(</span>argc <span class="sy1">></span> <span class="nu0">1</span> and argv<span class="sy1"><</span><span class="sy4">:</span><span class="nu0">1</span><span class="sy4">:</span><span class="sy1">></span> not_eq nullptr<span class="br0">)</span> <span class="sy1"><</span><span class="sy2">%</span>
|
|
greet<span class="br0">(</span>argv<span class="sy1"><</span><span class="sy4">:</span><span class="nu0">1</span><span class="sy4">:</span><span class="sy1">></span><span class="br0">)</span><span class="sy4">;</span>
|
|
<span class="sy2">%</span><span class="sy1">></span>
|
|
<span class="sy2">%</span><span class="sy1">></span></pre></div>
|
|
</div>
|
|
</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>
|