1205 lines
111 KiB
HTML
1205 lines
111 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_arithmetic 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>返回特定算术运算的结果。</p>
|
|
<table class="wikitable" style="font-size:85%;">
|
|
<tr>
|
|
<th rowspan="2">运算符名</th>
|
|
<th rowspan="2">语法</th>
|
|
<th rowspan="2"><a href="cpp-language-operators.html">可重载</a></th>
|
|
<th colspan="2">原型示例(对于 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw1">class</span> T</span></span>)</th>
|
|
</tr>
|
|
<tr>
|
|
<th>类内定义</th>
|
|
<th>类外定义</th>
|
|
</tr>
|
|
<tr>
|
|
<td>一元加</td>
|
|
<td><code>+a</code></td>
|
|
<td style="background: #90ff90; color: black; vertical-align: middle; text-align: center;" class="table-yes">是</td>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp">T T<span class="sy4">::</span><span class="me2">operator</span><span class="sy2">+</span><span class="br0">(</span><span class="br0">)</span> <span class="kw4">const</span><span class="sy4">;</span></span></span></td>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp">T operator<span class="sy2">+</span><span class="br0">(</span><span class="kw4">const</span> T <span class="sy3">&</span>a<span class="br0">)</span><span class="sy4">;</span></span></span></td>
|
|
</tr>
|
|
<tr>
|
|
<td>一元减</td>
|
|
<td><code>-a</code></td>
|
|
<td style="background: #90ff90; color: black; vertical-align: middle; text-align: center;" class="table-yes">是</td>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp">T T<span class="sy4">::</span><span class="me2">operator</span><span class="sy2">-</span><span class="br0">(</span><span class="br0">)</span> <span class="kw4">const</span><span class="sy4">;</span></span></span></td>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp">T operator<span class="sy2">-</span><span class="br0">(</span><span class="kw4">const</span> T <span class="sy3">&</span>a<span class="br0">)</span><span class="sy4">;</span></span></span></td>
|
|
</tr>
|
|
<tr>
|
|
<td>加法</td>
|
|
<td><code>a + b</code></td>
|
|
<td style="background: #90ff90; color: black; vertical-align: middle; text-align: center;" class="table-yes">是</td>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp">T T<span class="sy4">::</span><span class="me2">operator</span><span class="sy2">+</span><span class="br0">(</span><span class="kw4">const</span> T2 <span class="sy3">&</span>b<span class="br0">)</span> <span class="kw4">const</span><span class="sy4">;</span></span></span></td>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp">T operator<span class="sy2">+</span><span class="br0">(</span><span class="kw4">const</span> T <span class="sy3">&</span>a, <span class="kw4">const</span> T2 <span class="sy3">&</span>b<span class="br0">)</span><span class="sy4">;</span></span></span></td>
|
|
</tr>
|
|
<tr>
|
|
<td>减法</td>
|
|
<td><code>a - b</code></td>
|
|
<td style="background: #90ff90; color: black; vertical-align: middle; text-align: center;" class="table-yes">是</td>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp">T T<span class="sy4">::</span><span class="me2">operator</span><span class="sy2">-</span><span class="br0">(</span><span class="kw4">const</span> T2 <span class="sy3">&</span>b<span class="br0">)</span> <span class="kw4">const</span><span class="sy4">;</span></span></span></td>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp">T operator<span class="sy2">-</span><span class="br0">(</span><span class="kw4">const</span> T <span class="sy3">&</span>a, <span class="kw4">const</span> T2 <span class="sy3">&</span>b<span class="br0">)</span><span class="sy4">;</span></span></span></td>
|
|
</tr>
|
|
<tr>
|
|
<td>乘法</td>
|
|
<td><code>a * b</code></td>
|
|
<td style="background: #90ff90; color: black; vertical-align: middle; text-align: center;" class="table-yes">是</td>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp">T T<span class="sy4">::</span><span class="me2">operator</span><span class="sy2">*</span><span class="br0">(</span><span class="kw4">const</span> T2 <span class="sy3">&</span>b<span class="br0">)</span> <span class="kw4">const</span><span class="sy4">;</span></span></span></td>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp">T operator<span class="sy2">*</span><span class="br0">(</span><span class="kw4">const</span> T <span class="sy3">&</span>a, <span class="kw4">const</span> T2 <span class="sy3">&</span>b<span class="br0">)</span><span class="sy4">;</span></span></span></td>
|
|
</tr>
|
|
<tr>
|
|
<td>除法</td>
|
|
<td><code>a / b</code></td>
|
|
<td style="background: #90ff90; color: black; vertical-align: middle; text-align: center;" class="table-yes">是</td>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp">T T<span class="sy4">::</span><span class="me2">operator</span><span class="sy2">/</span><span class="br0">(</span><span class="kw4">const</span> T2 <span class="sy3">&</span>b<span class="br0">)</span> <span class="kw4">const</span><span class="sy4">;</span></span></span></td>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp">T operator<span class="sy2">/</span><span class="br0">(</span><span class="kw4">const</span> T <span class="sy3">&</span>a, <span class="kw4">const</span> T2 <span class="sy3">&</span>b<span class="br0">)</span><span class="sy4">;</span></span></span></td>
|
|
</tr>
|
|
<tr>
|
|
<td>模</td>
|
|
<td><code>a % b</code></td>
|
|
<td style="background: #90ff90; color: black; vertical-align: middle; text-align: center;" class="table-yes">是</td>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp">T T<span class="sy4">::</span><span class="me2">operator</span><span class="sy2">%</span><span class="br0">(</span><span class="kw4">const</span> T2 <span class="sy3">&</span>b<span class="br0">)</span> <span class="kw4">const</span><span class="sy4">;</span></span></span></td>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp">T operator<span class="sy2">%</span><span class="br0">(</span><span class="kw4">const</span> T <span class="sy3">&</span>a, <span class="kw4">const</span> T2 <span class="sy3">&</span>b<span class="br0">)</span><span class="sy4">;</span></span></span></td>
|
|
</tr>
|
|
<tr>
|
|
<td>逐位非</td>
|
|
<td><code>~a</code></td>
|
|
<td style="background: #90ff90; color: black; vertical-align: middle; text-align: center;" class="table-yes">是</td>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp">T T<span class="sy4">::</span><span class="me2">operator</span>~<span class="br0">(</span><span class="br0">)</span> <span class="kw4">const</span><span class="sy4">;</span></span></span></td>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp">T operator~<span class="br0">(</span><span class="kw4">const</span> T <span class="sy3">&</span>a<span class="br0">)</span><span class="sy4">;</span></span></span></td>
|
|
</tr>
|
|
<tr>
|
|
<td>逐位与</td>
|
|
<td><code>a & b</code></td>
|
|
<td style="background: #90ff90; color: black; vertical-align: middle; text-align: center;" class="table-yes">是</td>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp">T T<span class="sy4">::</span><span class="me2">operator</span><span class="sy3">&</span><span class="br0">(</span><span class="kw4">const</span> T2 <span class="sy3">&</span>b<span class="br0">)</span> <span class="kw4">const</span><span class="sy4">;</span></span></span></td>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp">T operator<span class="sy3">&</span><span class="br0">(</span><span class="kw4">const</span> T <span class="sy3">&</span>a, <span class="kw4">const</span> T2 <span class="sy3">&</span>b<span class="br0">)</span><span class="sy4">;</span></span></span></td>
|
|
</tr>
|
|
<tr>
|
|
<td>逐位或</td>
|
|
<td><code>a | b</code></td>
|
|
<td style="background: #90ff90; color: black; vertical-align: middle; text-align: center;" class="table-yes">是</td>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp">T T<span class="sy4">::</span><span class="me2">operator</span><span class="sy3">|</span><span class="br0">(</span><span class="kw4">const</span> T2 <span class="sy3">&</span>b<span class="br0">)</span> <span class="kw4">const</span><span class="sy4">;</span></span></span></td>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp">T operator<span class="sy3">|</span><span class="br0">(</span><span class="kw4">const</span> T <span class="sy3">&</span>a, <span class="kw4">const</span> T2 <span class="sy3">&</span>b<span class="br0">)</span><span class="sy4">;</span></span></span></td>
|
|
</tr>
|
|
<tr>
|
|
<td>逐位异或</td>
|
|
<td><code>a ^ b</code></td>
|
|
<td style="background: #90ff90; color: black; vertical-align: middle; text-align: center;" class="table-yes">是</td>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp">T T<span class="sy4">::</span><span class="me2">operator</span><span class="sy3">^</span><span class="br0">(</span><span class="kw4">const</span> T2 <span class="sy3">&</span>b<span class="br0">)</span> <span class="kw4">const</span><span class="sy4">;</span></span></span></td>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp">T operator<span class="sy3">^</span><span class="br0">(</span><span class="kw4">const</span> T <span class="sy3">&</span>a, <span class="kw4">const</span> T2 <span class="sy3">&</span>b<span class="br0">)</span><span class="sy4">;</span></span></span></td>
|
|
</tr>
|
|
<tr>
|
|
<td>逐位左移</td>
|
|
<td><code>a << b</code></td>
|
|
<td style="background: #90ff90; color: black; vertical-align: middle; text-align: center;" class="table-yes">是</td>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp">T T<span class="sy4">::</span><span class="me2">operator</span><span class="sy1"><<</span><span class="br0">(</span><span class="kw4">const</span> T2 <span class="sy3">&</span>b<span class="br0">)</span> <span class="kw4">const</span><span class="sy4">;</span></span></span></td>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp">T operator<span class="sy1"><<</span><span class="br0">(</span><span class="kw4">const</span> T <span class="sy3">&</span>a, <span class="kw4">const</span> T2 <span class="sy3">&</span>b<span class="br0">)</span><span class="sy4">;</span></span></span></td>
|
|
</tr>
|
|
<tr>
|
|
<td>逐位右移</td>
|
|
<td><code>a >> b</code></td>
|
|
<td style="background: #90ff90; color: black; vertical-align: middle; text-align: center;" class="table-yes">是</td>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp">T T<span class="sy4">::</span><span class="me2">operator</span><span class="sy1">>></span><span class="br0">(</span><span class="kw4">const</span> T2 <span class="sy3">&</span>b<span class="br0">)</span> <span class="kw4">const</span><span class="sy4">;</span></span></span></td>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp">T operator<span class="sy1">>></span><span class="br0">(</span><span class="kw4">const</span> T <span class="sy3">&</span>a, <span class="kw4">const</span> T2 <span class="sy3">&</span>b<span class="br0">)</span><span class="sy4">;</span></span></span></td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<dl>
|
|
<dd><b>注解</b><br /></dd>
|
|
</dl>
|
|
<ul>
|
|
<li>所有内建运算符都返回值,而大多数<a href="cpp-language-operators.html">用户定义重载</a>亦返回值,从而能以与内建版本相同的方式使用用户定义运算符。不过,用户定义重载中,任何类型都可以作为返回类型(包括 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">void</span></span></span>)。特别是,<code>operator<<</code> 和 <code>operator>></code> 为流插入和流抽取的重载所返回的是 <code>T&</code>。</li>
|
|
<li><code>T2</code> 可以为包括 <code>T</code> 在内的任何类型。</li>
|
|
</ul>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
<h3><span class="mw-headline" id=".E8.A7.A3.E9.87.8A">解释</span></h3>
|
|
<p>所有算术运算符计算特定算术运算的结果,并返回其结果。不修改实参。</p>
|
|
<h4><span class="mw-headline" id=".E8.BD.AC.E6.8D.A2">转换</span></h4>
|
|
<p>若传递给算术运算符的操作数是整型或无作用域枚举类型,则在任何其他行动前(但在左值到右值转换后,若其适用),对操作数实施<a href="cpp-language-implicit_conversion.html#.E6.95.B4.E5.9E.8B.E6.8F.90.E5.8D.87">整型提升</a>。若操作数之一具有数组或函数类型,则实施<a href="cpp-language-implicit_conversion.html#.E6.95.B0.E7.BB.84.E5.88.B0.E6.8C.87.E9.92.88.E8.BD.AC.E6.8D.A2">数组到指针</a>和<a href="cpp-language-implicit_conversion.html#.E5.87.BD.E6.95.B0.E5.88.B0.E6.8C.87.E9.92.88">函数到指针</a>转换。</p>
|
|
<p>对于(除移位之外的)二元运算符,当提升后的操作数拥有不同类型时,实施称为<i>一般算术转换 (usual arithmetic conversion)</i>的一组额外的隐式转换,目的是产生<i>公共类型 (common type)</i>(亦可由 <span class="t-lc"><a href="cpp-types-common_type.html">std::common_type</a></span> 类型特性访问)。<span class="t-rev-inl t-since-cxx20"><span>若在任何整型提升前,一个操作数为枚举类型而另一操作数为浮点类型或不同的枚举类型,则此行为被弃用。</span> <span><span class="t-mark-rev t-since-cxx20">(C++20 起)</span></span></span></p>
|
|
<ul>
|
|
<li>若任一操作数具有<a href="cpp-language-enum.html#.E6.9C.89.E4.BD.9C.E7.94.A8.E5.9F.9F.E6.9E.9A.E4.B8.BE">有作用域枚举类型</a>,则不进行转换:另一操作数和返回类型必须具有相同类型</li>
|
|
</ul>
|
|
<ul>
|
|
<li>否则,若任一操作数为 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">long</span> <span class="kw4">double</span></span></span>,则将另一操作数转换为 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">long</span> <span class="kw4">double</span></span></span></li>
|
|
</ul>
|
|
<ul>
|
|
<li>否则,若任一操作数为 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">double</span></span></span>,则将另一操作数转换为 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">double</span></span></span></li>
|
|
</ul>
|
|
<ul>
|
|
<li>否则,若任一操作数为 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">float</span></span></span>,则将另一操作数转换为 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">float</span></span></span></li>
|
|
</ul>
|
|
<ul>
|
|
<li>否则,操作数拥有整数类型(因为 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">bool</span></span></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">char8_t</span></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 class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">wchar_t</span></span></span> 和无作用域枚举在此时已被提升),并对其实施<a href="cpp-language-implicit_conversion.html#.E6.95.B4.E5.9E.8B.E8.BD.AC.E6.8D.A2">整型转换</a>以产生如下的公共类型:</li>
|
|
</ul>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>若两个操作数均为有符号或均为无符号,则将拥有较小<i>转换等级</i>的操作数转换为拥有较大整数转换等级的操作数的类型。</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>否则,若无符号操作数的转换等级大于或等于有符号操作数的转换等级,则将有符号操作数转换为无符号操作数的类型。</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>否则,若有符号操作数的类型能表示无符号操作数类型的所有值,则将无符号操作数转换为有符号操作数的类型。</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>否则,将两个操作数都转换为有符号操作数的无符号对应版本。</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
<p><i>转换等级(conversion rank)</i>按 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">bool</span></span></span>、<span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">signed</span> <span class="kw4">char</span></span></span>、<span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">short</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">long</span></span></span>、<span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">long</span> <span class="kw4">long</span></span></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">signed</span> <span class="kw4">char</span></span></span> 和 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">unsigned</span> <span class="kw4">char</span></span></span> 的等级。<span class="t-c"><span class="mw-geshi cpp source-cpp">char8_t</span></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 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.BA.A2.E5.87.BA">溢出</span></h4>
|
|
<p>无符号整数算术始终进行 <span class="texhtml" style="white-space: nowrap;">modulo 2<span class="t-su">n<br /></span></span>,其中 n 是该整数的位数。例如对于 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">unsigned</span> <span class="kw4">int</span></span></span>,向 <span class="t-lc"><a href="cpp-types-climits.html">UINT_MAX</a></span> 加一得到 <span class="t-c"><span class="mw-geshi cpp source-cpp">​<span class="nu0">0</span>​</span></span>,而从 <span class="t-c"><span class="mw-geshi cpp source-cpp">​<span class="nu0">0</span>​</span></span> 减一得到 <span class="t-lc"><a href="cpp-types-climits.html">UINT_MAX</a></span>。</p>
|
|
<p>有符号整数算术运算溢出(结果类型无法容纳其结果)时,行为未定义,此类操作可能会表现为:</p>
|
|
<ul>
|
|
<li>按照表示法的规则(典型为补码)发生回绕,</li>
|
|
</ul>
|
|
<ul>
|
|
<li>在某些平台上或由于编译器选项(例如 GCC 和 Clang 中的 <code>-ftrapv</code>)引发陷阱,</li>
|
|
</ul>
|
|
<ul>
|
|
<li>在某些时候截断到最小或最大值(在许多 DSP 上)</li>
|
|
</ul>
|
|
<ul>
|
|
<li>完全<a rel="nofollow" class="external text" href="http://blog.llvm.org/2011/05/what-every-c-programmer-should-know_14.html">被编译器优化掉</a>。</li>
|
|
</ul>
|
|
<h4><span class="mw-headline" id=".E6.B5.AE.E7.82.B9.E7.8E.AF.E5.A2.83">浮点环境</span></h4>
|
|
<p>若支持 <a href="cpp-preprocessor-impl.html"><tt>#pragma STDC FENV_ACCESS</tt></a> 并设置它为 <code>ON</code>,则所有浮点算术运算符都服从当前浮点<a href="cpp-numeric-fenv-FE_round.html">舍入方向</a>,并报告 <a href="cpp-numeric-math-math_errhandling.html"><tt>math_errhandling</tt></a> 中指定的浮点算术错误,除非是发生于<a href="cpp-language-initialization.html#.E9.9D.9E.E5.B1.80.E9.83.A8.E5.8F.98.E9.87.8F">静态初始化器</a>之中(该情况下不引发浮点异常,且舍入模式为最近舍入)。</p>
|
|
<h4><span class="mw-headline" id=".E6.B5.AE.E7.82.B9.E7.BC.A9.E7.95.A5">浮点缩略</span></h4>
|
|
<p>除非支持 <a href="cpp-preprocessor-impl.html"><tt>#pragma STDC FP_CONTRACT</tt></a> 并设置它为 <code>OFF</code>,否则所有浮点算术都可以如同其中间结果拥有无限范围和精度一般进行,即允许实施省略舍入误差和浮点异常的优化。例如 C++ 允许以单条融合乘加 CPU 指令来实现 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="br0">(</span>x<span class="sy2">*</span>y<span class="br0">)</span> <span class="sy2">+</span> z</span></span>,或把 <span class="t-c"><span class="mw-geshi cpp source-cpp">a <span class="sy1">=</span> x<span class="sy2">*</span>x<span class="sy2">*</span>x<span class="sy2">*</span>x<span class="sy4">;</span></span></span> 优化为 <span class="t-c"><span class="mw-geshi cpp source-cpp">tmp <span class="sy1">=</span> x <span class="sy2">*</span>x<span class="sy4">;</span> a <span class="sy1">=</span> tmp<span class="sy2">*</span>tmp</span></span>。</p>
|
|
<p>无关乎缩略,浮点算术的中间结果可拥有与其类型所指定不同的范围和精度,见 <span class="t-lc"><a href="cpp-types-climits-FLT_EVAL_METHOD.html">FLT_EVAL_METHOD</a></span>。</p>
|
|
<p>正式来讲,C++ 标准不在浮点运算的精度上做任何保证。</p>
|
|
<h4><span class="mw-headline" id=".E4.B8.80.E5.85.83.E7.AE.97.E6.9C.AF.E8.BF.90.E7.AE.97.E7.AC.A6">一元算术运算符</span></h4>
|
|
<p>一元算术运算符表达式的形式为</p>
|
|
<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">表达式</span></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>-</b></code> <span class="t-spar">表达式</span></td>
|
|
<td>(2)</td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
</table>
|
|
<div class="t-li1"><span class="t-li">1)</span> 一元加(提升)。</div>
|
|
<div class="t-li1"><span class="t-li"></span> 对于内建运算符,<span class="t-spar">表达式</span> 必须拥有算术、无作用域枚举或指针类型。若操作数具有整型或无作用域枚举类型,则对其实施整型提升,并确定结果类型。</div>
|
|
<div class="t-li1"><span class="t-li">2)</span> 一元减(取反)。</div>
|
|
<div class="t-li1"><span class="t-li"></span> 对于内建运算符,<span class="t-spar">表达式</span> 必须拥有算术或无作用域枚举类型。对操作数实施整型提升,并确定结果类型。</div>
|
|
<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">int</span></span></span>,或者当操作数服从左值到右值、数组到指针或函数到指针转换时。</p>
|
|
<p>内建的一元减运算符计算其提升后操作数的相反数。对于无符号的 <code>a</code>,<code>-a</code> 的值为 <span class="texhtml" style="white-space: nowrap;">2<span class="t-su">b<br /></span>-a</span>,其中 <code>b</code> 为提升后的位数。</p>
|
|
<p>在<a href="cpp-language-overload_resolution.html#.E8.B0.83.E7.94.A8.E9.87.8D.E8.BD.BD.E8.BF.90.E7.AE.97.E7.AC.A6">针对用户定义运算符的重载决议</a>中,对于每个 cv 无限定的提升后算术类型 <code>A</code> 和每个类型 <code>T</code>,下列函数签名参与重载决议:</p>
|
|
<table class="t-dcl-begin">
|
|
<tbody>
|
|
<tr class="t-dcl">
|
|
<td class="t-dcl-nopad">
|
|
<div><span class="mw-geshi cpp source-cpp">A operator<span class="sy2">+</span><span class="br0">(</span>A<span class="br0">)</span></span></div>
|
|
</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
<td class="t-dcl-nopad"></td>
|
|
</tr>
|
|
<tr class="t-dcl">
|
|
<td class="t-dcl-nopad">
|
|
<div><span class="mw-geshi cpp source-cpp">T<span class="sy2">*</span> operator<span class="sy2">+</span><span class="br0">(</span>T<span class="sy2">*</span><span class="br0">)</span></span></div>
|
|
</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
<td class="t-dcl-nopad"></td>
|
|
</tr>
|
|
<tr class="t-dcl">
|
|
<td class="t-dcl-nopad">
|
|
<div><span class="mw-geshi cpp source-cpp">A operator<span class="sy2">-</span><span class="br0">(</span>A<span class="br0">)</span></span></div>
|
|
</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
<td class="t-dcl-nopad"></td>
|
|
</tr>
|
|
<tr class="t-dcl-sep">
|
|
<td></td>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<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>
|
|
<span class="kw4">char</span> c <span class="sy1">=</span> <span class="nu12">0x6a</span><span class="sy4">;</span>
|
|
<span class="kw4">int</span> n1 <span class="sy1">=</span> <span class="nu0">1</span><span class="sy4">;</span>
|
|
<span class="kw4">unsigned</span> <span class="kw4">char</span> n2 <span class="sy1">=</span> <span class="nu0">1</span><span class="sy4">;</span>
|
|
<span class="kw4">unsigned</span> <span class="kw4">int</span> n3 <span class="sy1">=</span> <span class="nu0">1</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">"char:"</span> <span class="sy1"><<</span> c <span class="sy1"><<</span> <span class="st0">" int:"</span> <span class="sy1"><<</span> <span class="sy2">+</span>c <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span>
|
|
<span class="sy1"><<</span> <span class="st0">"-1,当 1 的类型是 signed 时:"</span> <span class="sy1"><<</span> <span class="sy2">-</span>n1 <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span>
|
|
<span class="sy1"><<</span> <span class="st0">"-1,当 1 的类型是 unsigned char 时:"</span> <span class="sy1"><<</span> <span class="sy2">-</span>n2 <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span>
|
|
<span class="sy1"><<</span> <span class="st0">"-1,当 1 的类型是 unsigned int 时:"</span> <span class="sy1"><<</span> <span class="sy2">-</span>n3 <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span><span class="sy4">;</span>
|
|
<span class="kw4">char</span> a<span class="br0">[</span><span class="nu0">3</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> sizeof a <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span>
|
|
<span class="sy1"><<</span> <span class="st0">"指针大小:"</span> <span class="sy1"><<</span> sizeof <span class="sy2">+</span>a <span class="sy1"><<</span> <span class="st0">'<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">char:j int:106
|
|
-1,当 1 的类型是 signed 时:-1
|
|
-1,当 1 的类型是 unsigned char 时:-1
|
|
-1,当 1 的类型是 unsigned int 时:4294967295
|
|
数组大小:3
|
|
指针大小:8</pre></div>
|
|
</div>
|
|
</div>
|
|
<h4><span class="mw-headline" id=".E5.8A.A0.E6.80.A7.E8.BF.90.E7.AE.97.E7.AC.A6">加性运算符</span></h4>
|
|
<p>二元加性算术运算符表达式的形式为</p>
|
|
<table class="t-sdsc-begin">
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td><span class="t-spar">左操作数</span> <code><b>+</b></code> <span class="t-spar">右操作数</span></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><span class="t-spar">左操作数</span> <code><b>-</b></code> <span class="t-spar">右操作数</span></td>
|
|
<td>(2)</td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
</table>
|
|
<div class="t-li1"><span class="t-li">1)</span> 加法</div>
|
|
<div class="t-li1"><span class="t-li"></span> 对于内建运算符,<span class="t-spar">左操作数</span> 和 <span class="t-spar">右操作数</span> 必须为下列之一:
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>都拥有算术或无作用域枚举类型。这种情况下,对两个操作数都实施一般算术转换,并确定结果类型。</li>
|
|
<li>一个是指向完整定义的对象的指针类型,另一个拥有整型或无作用域枚举类型。此情况下,结果具有指针的类型。</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
</div>
|
|
<div class="t-li1"><span class="t-li">2)</span> 减法</div>
|
|
<div class="t-li1"><span class="t-li"></span> 对于内建运算符,<span class="t-spar">左操作数</span> 和 <span class="t-spar">右操作数</span> 必须为下列之一:
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>都拥有算术或无作用域枚举类型。这种情况下,对两个操作数都实施一般算术转换,并确定结果类型。</li>
|
|
<li><span class="t-spar">左操作数</span> 为指向完整定义的对象类型的指针,<span class="t-spar">右操作数</span> 拥有整型或无作用域枚举类型。此情况下,结果具有指针的类型。</li>
|
|
<li>忽略 cv 限定符时,两者都是指向相同完整定义的对象类型的指针。此情况下,结果类型为 <span class="t-lc"><a href="cpp-types-ptrdiff_t.html">std::ptrdiff_t</a></span>。</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
</div>
|
|
<p>对于算术或枚举类型的操作数,二元加的结果是操作数(经一般算术转换后)的和,而二元减运算符的结果是第一操作数减去第二操作数(经一般算术转换后)的结果,但是,如果该类型支持 IEEE 浮点算术(见 <span class="t-lc"><a href="cpp-types-numeric_limits-is_iec559.html">std::numeric_limits::is_iec559</a></span>),</p>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>若操作数之一为 NaN,则结果为 NaN</li>
|
|
<li>无穷减无穷为 NaN,并引发 <span class="t-lc"><a href="cpp-numeric-fenv-FE_exceptions.html">FE_INVALID</a></span></li>
|
|
<li>无穷加负无穷为 NaN,并引发 <span class="t-lc"><a href="cpp-numeric-fenv-FE_exceptions.html">FE_INVALID</a></span></li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
<p>若任何操作数为指针,则适用下列规则:</p>
|
|
<ul>
|
|
<li>把指向非数组对象的指针当做指向大小为 1 的数组的首元素的指针。</li>
|
|
<li>若指针 <code>P</code> 指向数组的第 <code>i</code> 个元素,则表达式 <code>P+n</code>、<code>n+P</code> 和 <code>P-n</code> 分别是指向同一数组的第 <code>i+n</code>、第 <code>i+n</code> 和第 <code>i-n</code> 个元素的同类型指针。指针加法的结果亦可为末尾后一位置(one past the end)的指针(即使得 <code>P-1</code> 指向数组末元素的指针 <code>P</code>)。任何其他情形(即试图生成不指向同一数组的任何元素或同一数组末尾后一位置的指针)均引起未定义行为。</li>
|
|
<li>若指针 <code>P</code> 指向数组的第 <code>i</code> 个元素,而指针 <code>Q</code> 指向同一数组的第 <code>j</code> 个元素,则表达式 <code>P-Q</code> 拥有值 <span class="t-c"><span class="mw-geshi cpp source-cpp">i<span class="sy2">-</span>j</span></span>(若 <span class="t-lc"><a href="cpp-types-ptrdiff_t.html">std::ptrdiff_t</a></span> 可容纳该值)。两个操作数都必须指向同一数组的元素(或末尾后一位置),否则行为未定义。若结果不能由 <span class="t-lc"><a href="cpp-types-ptrdiff_t.html">std::ptrdiff_t</a></span> 容纳,则行为未定义。</li>
|
|
<li>任何情况下,如果所指向的类型与数组元素类型不同(其中对于每一层元素,若它们自身即为指针,则不考虑其 cv 限定性),则指针算术的行为未定义。特别是,以指向某个派生对象数组中的元素的指向基类指针做指针算术是未定义的。</li>
|
|
<li>对指针加或减 <span class="t-c"><span class="mw-geshi cpp source-cpp">​<span class="nu0">0</span>​</span></span>,结果就是该指针,没有更改。若两个指针指向同一对象,或都指向同一数组的末尾后一位置,或都是空指针,则减法的结果等于 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="br0">(</span><a href="cpp-types-ptrdiff_t.html"><span class="kw101">std::<span class="me2">ptrdiff_t</span></span></a><span class="br0">)</span><span class="nu0">0</span></span></span>。</li>
|
|
</ul>
|
|
<p>这些指针算术运算符使得指针满足<a href="cpp-named_req-RandomAccessIterator.html"><span style="font-style:italic">老式随机访问迭代器</span> <span style="font-family: Georgia, 'DejaVu Serif', serif; font-style:italic">(LegacyRandomAccessIterator)</span></a> 的要求。</p>
|
|
<p>在<a href="cpp-language-overload_resolution.html#.E8.B0.83.E7.94.A8.E9.87.8D.E8.BD.BD.E8.BF.90.E7.AE.97.E7.AC.A6">针对用户定义运算符的重载决议</a>中,对于每对提升后的算术类型 <code>L</code> 和 <code>R</code> 和每个对象类型 <code>T</code>,下列函数签名参与重载决议:</p>
|
|
<table class="t-dcl-begin">
|
|
<tbody>
|
|
<tr class="t-dcl">
|
|
<td class="t-dcl-nopad">
|
|
<div><span class="mw-geshi cpp source-cpp">LR operator<span class="sy2">+</span><span class="br0">(</span>L, R<span class="br0">)</span></span></div>
|
|
</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
<td class="t-dcl-nopad"></td>
|
|
</tr>
|
|
<tr class="t-dcl">
|
|
<td class="t-dcl-nopad">
|
|
<div><span class="mw-geshi cpp source-cpp">LR operator<span class="sy2">-</span><span class="br0">(</span>L, R<span class="br0">)</span></span></div>
|
|
</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
<td class="t-dcl-nopad"></td>
|
|
</tr>
|
|
<tr class="t-dcl">
|
|
<td class="t-dcl-nopad">
|
|
<div><span class="mw-geshi cpp source-cpp">T<span class="sy2">*</span> operator<span class="sy2">+</span><span class="br0">(</span>T<span class="sy2">*</span>, <a href="cpp-types-ptrdiff_t.html"><span class="kw101">std::<span class="me2">ptrdiff_t</span></span></a><span class="br0">)</span></span></div>
|
|
</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
<td class="t-dcl-nopad"></td>
|
|
</tr>
|
|
<tr class="t-dcl">
|
|
<td class="t-dcl-nopad">
|
|
<div><span class="mw-geshi cpp source-cpp">T<span class="sy2">*</span> operator<span class="sy2">+</span><span class="br0">(</span><a href="cpp-types-ptrdiff_t.html"><span class="kw101">std::<span class="me2">ptrdiff_t</span></span></a>, T<span class="sy2">*</span><span class="br0">)</span></span></div>
|
|
</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
<td class="t-dcl-nopad"></td>
|
|
</tr>
|
|
<tr class="t-dcl">
|
|
<td class="t-dcl-nopad">
|
|
<div><span class="mw-geshi cpp source-cpp">T<span class="sy2">*</span> operator<span class="sy2">-</span><span class="br0">(</span>T<span class="sy2">*</span>, <a href="cpp-types-ptrdiff_t.html"><span class="kw101">std::<span class="me2">ptrdiff_t</span></span></a><span class="br0">)</span></span></div>
|
|
</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
<td class="t-dcl-nopad"></td>
|
|
</tr>
|
|
<tr class="t-dcl">
|
|
<td class="t-dcl-nopad">
|
|
<div><span class="mw-geshi cpp source-cpp"><a href="cpp-types-ptrdiff_t.html"><span class="kw101">std::<span class="me2">ptrdiff_t</span></span></a> operator<span class="sy2">-</span><span class="br0">(</span>T<span class="sy2">*</span>, T<span class="sy2">*</span><span class="br0">)</span></span></div>
|
|
</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
<td class="t-dcl-nopad"></td>
|
|
</tr>
|
|
<tr class="t-dcl-sep">
|
|
<td></td>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p>其中 <code>LR</code> 是对 <code>L</code> 和 <code>R</code> 实施一般算术转换的结果。</p>
|
|
<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>
|
|
<span class="kw4">char</span> c <span class="sy1">=</span> <span class="nu0">2</span><span class="sy4">;</span>
|
|
<span class="kw4">unsigned</span> <span class="kw4">int</span> un <span class="sy1">=</span> <span class="nu0">2</span><span class="sy4">;</span>
|
|
<span class="kw4">int</span> n <span class="sy1">=</span> <span class="sy2">-</span><span class="nu0">10</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">" 2 + (-10),当 2 的类型是 char 时 = "</span> <span class="sy1"><<</span> c <span class="sy2">+</span> n <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span>
|
|
<span class="sy1"><<</span> <span class="st0">" 2 + (-10),当 2 的类型是 unsigned 时 = "</span> <span class="sy1"><<</span> un <span class="sy2">+</span> n <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span>
|
|
<span class="sy1"><<</span> <span class="st0">" -10 - 2.12 = "</span> <span class="sy1"><<</span> n <span class="sy2">-</span> <span class="nu16">2.12</span> <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span><span class="sy4">;</span>
|
|
|
|
<span class="kw4">char</span> a<span class="br0">[</span><span class="nu0">4</span><span class="br0">]</span> <span class="sy1">=</span> <span class="br0">{</span><span class="st0">'a'</span>, <span class="st0">'b'</span>, <span class="st0">'c'</span>, <span class="st0">'d'</span><span class="br0">}</span><span class="sy4">;</span>
|
|
<span class="kw4">char</span><span class="sy2">*</span> p <span class="sy1">=</span> <span class="sy3">&</span>a<span class="br0">[</span><span class="nu0">1</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> <span class="sy2">*</span>p <span class="sy1"><<</span> <span class="sy2">*</span><span class="br0">(</span>p <span class="sy2">+</span> <span class="nu0">2</span><span class="br0">)</span>
|
|
<span class="sy1"><<</span> <span class="sy2">*</span><span class="br0">(</span><span class="nu0">2</span> <span class="sy2">+</span> p<span class="br0">)</span> <span class="sy1"><<</span> <span class="sy2">*</span><span class="br0">(</span>p <span class="sy2">-</span> <span class="nu0">1</span><span class="br0">)</span> <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span><span class="sy4">;</span>
|
|
<span class="kw4">char</span><span class="sy2">*</span> p2 <span class="sy1">=</span> <span class="sy3">&</span>a<span class="br0">[</span><span class="nu0">4</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> p2 <span class="sy2">-</span> p <span class="sy1"><<</span> <span class="st0">'<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">
|
|
2 + (-10),当 2 的类型是 char 时 = -8
|
|
2 + (-10),当 2 的类型是 unsigned 时 = 4294967288
|
|
-10 - 2.12 = -12.12
|
|
指针相加的例子:bdda
|
|
指针的差:3</pre></div>
|
|
</div>
|
|
</div>
|
|
<h4><span class="mw-headline" id=".E4.B9.98.E6.80.A7.E8.BF.90.E7.AE.97.E7.AC.A6">乘性运算符</span></h4>
|
|
<p>二元乘性运算符表达式的形式为</p>
|
|
<table class="t-sdsc-begin">
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td><span class="t-spar">左操作数</span> <code><b>*</b></code> <span class="t-spar">右操作数</span></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><span class="t-spar">左操作数</span> <code><b>/</b></code> <span class="t-spar">右操作数</span></td>
|
|
<td>(2)</td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td><span class="t-spar">左操作数</span> <code><b>%</b></code> <span class="t-spar">右操作数</span></td>
|
|
<td>(3)</td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
</table>
|
|
<div class="t-li1"><span class="t-li">1)</span> 乘法</div>
|
|
<div class="t-li1"><span class="t-li"></span> 对于内建运算符,<span class="t-spar">左操作数</span> 和 <span class="t-spar">右操作数</span> 必须都具有算术或无作用域枚举类型。</div>
|
|
<div class="t-li1"><span class="t-li">2)</span> 除法</div>
|
|
<div class="t-li1"><span class="t-li"></span> 对于内建运算符,<span class="t-spar">左操作数</span> 和 <span class="t-spar">右操作数</span> 必须都具有算术或无作用域枚举类型。</div>
|
|
<div class="t-li1"><span class="t-li">3)</span> 求余</div>
|
|
<div class="t-li1"><span class="t-li"></span> 对于内建运算符,<span class="t-spar">左操作数</span> 和 <span class="t-spar">右操作数</span> 必须都具有算术或无作用域枚举类型。</div>
|
|
<p>这三个运算符均对两个操作数实施一般算术转换,并确定结果类型。</p>
|
|
<p>二元运算符 * 进行其操作数(经一般算术转换后)的乘法,但对于浮点乘法,</p>
|
|
<ul>
|
|
<li>NaN 乘以任何数均得 NaN</li>
|
|
<li>无穷乘以零得 NaN 并引发 <span class="t-lc"><a href="cpp-numeric-fenv-FE_exceptions.html">FE_INVALID</a></span></li>
|
|
</ul>
|
|
<p>二元运算符 / 将第一操作数除以第二操作数(经一般算术转换后)。</p>
|
|
<p>对于整型操作数,它产生代数商,</p>
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-until-cxx11">
|
|
<td>
|
|
<p>以实现定义的方向对商进行舍入。</p>
|
|
</td>
|
|
<td><span class="t-mark-rev t-until-cxx11">(C++11 前)</span></td>
|
|
</tr>
|
|
<tr class="t-rev t-since-cxx11">
|
|
<td>
|
|
<p>商向零取整(舍弃小数部分)。</p>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-cxx11">(C++11 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
<p>若第二操作数为零,则行为未定义,但若进行浮点除法且类型支持 IEEE 浮点算术(见 <span class="t-lc"><a href="cpp-types-numeric_limits-is_iec559.html">std::numeric_limits::is_iec559</a></span>),则:</p>
|
|
<ul>
|
|
<li>若操作数之一为 NaN,则结果为 NaN</li>
|
|
<li>非零数除以 ±0.0 得到符号正确的无穷,并引发 <span class="t-lc"><a href="cpp-numeric-fenv-FE_exceptions.html">FE_DIVBYZERO</a></span></li>
|
|
<li>0.0 除以 0.0 得 NaN,并引发 <span class="t-lc"><a href="cpp-numeric-fenv-FE_exceptions.html">FE_INVALID</a></span></li>
|
|
</ul>
|
|
<p>二元运算符 % 产生以第二操作数整除第一操作数的余数(经一般算术转换后;注意各操作数的类型必须都为整型类型)。若商 <code>a/b</code> 能以结果类型表示,则 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="br0">(</span>a<span class="sy2">/</span>b<span class="br0">)</span><span class="sy2">*</span>b <span class="sy2">+</span> a<span class="sy2">%</span>b <span class="sy1">==</span> a</span></span>。若第二操作数为零,则行为未定义。若商 <code>a/b</code> 不能以结果类型表示,则 <code>a/b</code> 和 <code>a%b</code> 的行为均未定义(这意味着,补码系统上 <span class="t-c"><span class="mw-geshi cpp source-cpp">INT_MIN<span class="sy2">%-</span><span class="nu0">1</span></span></span> 为未定义)。</p>
|
|
<p>注意:C++11 之前,若二元运算符 % 的一或两个操作数为负,则余数符号是实现定义的,因为它取决于整数除法的舍入方向。函数 <span class="t-lc"><a href="cpp-numeric-math-div.html">std::div</a></span> 在该情况下提供良好定义的行为。</p>
|
|
<p>注意:对于浮点余数,见 <span class="t-lc"><a href="cpp-numeric-math-remainder.html">std::remainder</a></span> 和 <span class="t-lc"><a href="cpp-numeric-math-fmod.html">std::fmod</a></span>。</p>
|
|
<p>在<a href="cpp-language-overload_resolution.html#.E8.B0.83.E7.94.A8.E9.87.8D.E8.BD.BD.E8.BF.90.E7.AE.97.E7.AC.A6">针对用户定义运算符的重载决议中</a>,对于每对提升后的算术类型 <code>LA</code> 与 <code>RA</code> 及每对提升后的整型类型 <code>LI</code> 与 <code>RI</code>,下列函数签名参与重载决议:</p>
|
|
<table class="t-dcl-begin">
|
|
<tbody>
|
|
<tr class="t-dcl">
|
|
<td class="t-dcl-nopad">
|
|
<div><span class="mw-geshi cpp source-cpp">LRA operator<span class="sy2">*</span><span class="br0">(</span>LA, RA<span class="br0">)</span></span></div>
|
|
</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
<td class="t-dcl-nopad"></td>
|
|
</tr>
|
|
<tr class="t-dcl">
|
|
<td class="t-dcl-nopad">
|
|
<div><span class="mw-geshi cpp source-cpp">LRA operator<span class="sy2">/</span><span class="br0">(</span>LA, RA<span class="br0">)</span></span></div>
|
|
</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
<td class="t-dcl-nopad"></td>
|
|
</tr>
|
|
<tr class="t-dcl">
|
|
<td class="t-dcl-nopad">
|
|
<div><span class="mw-geshi cpp source-cpp">LRI operator<span class="sy2">%</span><span class="br0">(</span>LI, RI<span class="br0">)</span></span></div>
|
|
</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
<td class="t-dcl-nopad"></td>
|
|
</tr>
|
|
<tr class="t-dcl-sep">
|
|
<td></td>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p>其中 <code>LRx</code> 是对 <code>Lx</code> 和 <code>Rx</code> 实施一般算术转换的结果。</p>
|
|
<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>
|
|
<span class="kw4">char</span> c <span class="sy1">=</span> <span class="nu0">2</span><span class="sy4">;</span>
|
|
<span class="kw4">unsigned</span> <span class="kw4">int</span> un <span class="sy1">=</span> <span class="nu0">2</span><span class="sy4">;</span>
|
|
<span class="kw4">int</span> n <span class="sy1">=</span> <span class="sy2">-</span><span class="nu0">10</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">"2 * (-10),当 2 的类型是 char 时 = "</span> <span class="sy1"><<</span> c <span class="sy2">*</span> n <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span>
|
|
<span class="sy1"><<</span> <span class="st0">"2 * (-10),当 2 的类型是 unsigned 时 = "</span> <span class="sy1"><<</span> un <span class="sy2">*</span> n <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span>
|
|
<span class="sy1"><<</span> <span class="st0">"-10 / 2.12 = "</span> <span class="sy1"><<</span> n <span class="sy2">/</span> <span class="nu16">2.12</span> <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span>
|
|
<span class="sy1"><<</span> <span class="st0">"-10 / 21 = "</span> <span class="sy1"><<</span> n <span class="sy2">/</span> <span class="nu0">21</span> <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span>
|
|
<span class="sy1"><<</span> <span class="st0">"-10 % 21 = "</span> <span class="sy1"><<</span> n <span class="sy2">%</span> <span class="nu0">21</span> <span class="sy1"><<</span> <span class="st0">'<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">2 * (-10),当 2 的类型是 char 时 = -20
|
|
2 * (-10),当 2 的类型是 unsigned 时 = 4294967276
|
|
-10 / 2.12 = -4.71698
|
|
-10 / 21 = 0
|
|
-10 % 21 = -10</pre></div>
|
|
</div>
|
|
</div>
|
|
<h4><span class="mw-headline" id=".E9.80.90.E4.BD.8D.E9.80.BB.E8.BE.91.E8.BF.90.E7.AE.97.E7.AC.A6">逐位逻辑运算符</span></h4>
|
|
<p>逐位算术运算符表达式的形式为</p>
|
|
<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">右操作数</span></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><span class="t-spar">左操作数</span> <code><b>&</b></code> <span class="t-spar">右操作数</span></td>
|
|
<td>(2)</td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td><span class="t-spar">左操作数</span> <code><b>|</b></code> <span class="t-spar">右操作数</span></td>
|
|
<td>(3)</td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td><span class="t-spar">左操作数</span> <code><b>^</b></code> <span class="t-spar">右操作数</span></td>
|
|
<td>(4)</td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
</table>
|
|
<div class="t-li1"><span class="t-li">1)</span> 逐位非(NOT)</div>
|
|
<div class="t-li1"><span class="t-li">2)</span> 逐位与(AND)</div>
|
|
<div class="t-li1"><span class="t-li">3)</span> 逐位或(OR)</div>
|
|
<div class="t-li1"><span class="t-li">4)</span> 逐位异或(XOR)</div>
|
|
<div class="t-li1"><span class="t-li"></span> 对于内建运算符,<span class="t-spar">左操作数</span> 和 <span class="t-spar">右操作数</span> 必须都拥有整型或无作用域枚举类型。对两个操作数实施一般算术转换,并确定结果类型。</div>
|
|
<p>operator~ 的结果是实参值(提升后)的逐位非(反码)。operator& 的结果是两个操作数值(经一般算术转换后)的逐位与。operator| 的结果是两个操作数值(经一般算术转换后)的逐位或。operator^ 的结果是两个操作数值(经一般算术转换后)的逐位异或。</p>
|
|
<p>在<a href="cpp-language-overload_resolution.html#.E8.B0.83.E7.94.A8.E9.87.8D.E8.BD.BD.E8.BF.90.E7.AE.97.E7.AC.A6">针对用户定义运算符的重载决议</a>中,对于每对提升后的整型类型 <code>L</code> 和 <code>R</code>,下列函数签名参与重载决议:</p>
|
|
<table class="t-dcl-begin">
|
|
<tbody>
|
|
<tr class="t-dcl">
|
|
<td class="t-dcl-nopad">
|
|
<div><span class="mw-geshi cpp source-cpp">R operator~<span class="br0">(</span>R<span class="br0">)</span></span></div>
|
|
</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
<td class="t-dcl-nopad"></td>
|
|
</tr>
|
|
<tr class="t-dcl">
|
|
<td class="t-dcl-nopad">
|
|
<div><span class="mw-geshi cpp source-cpp">LR operator<span class="sy3">&</span><span class="br0">(</span>L, R<span class="br0">)</span></span></div>
|
|
</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
<td class="t-dcl-nopad"></td>
|
|
</tr>
|
|
<tr class="t-dcl">
|
|
<td class="t-dcl-nopad">
|
|
<div><span class="mw-geshi cpp source-cpp">LR operator<span class="sy3">^</span><span class="br0">(</span>L, R<span class="br0">)</span></span></div>
|
|
</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
<td class="t-dcl-nopad"></td>
|
|
</tr>
|
|
<tr class="t-dcl">
|
|
<td class="t-dcl-nopad">
|
|
<div><span class="mw-geshi cpp source-cpp">LR operator<span class="sy3">|</span><span class="br0">(</span>L, R<span class="br0">)</span></span></div>
|
|
</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
<td class="t-dcl-nopad"></td>
|
|
</tr>
|
|
<tr class="t-dcl-sep">
|
|
<td></td>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p>其中 <code>LR</code> 是对 <code>L</code> 和 <code>R</code> 实施一般算术转换的结果。</p>
|
|
<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="co2">#include <iomanip></span>
|
|
<span class="co2">#include <bitset></span>
|
|
<span class="kw4">int</span> main<span class="br0">(</span><span class="br0">)</span>
|
|
<span class="br0">{</span>
|
|
uint16_t mask <span class="sy1">=</span> <span class="nu12">0x00f0</span><span class="sy4">;</span>
|
|
uint32_t x0 <span class="sy1">=</span> <span class="nu12">0x12345678</span><span class="sy4">;</span>
|
|
uint32_t x1 <span class="sy1">=</span> x0 <span class="sy3">|</span> mask<span class="sy4">;</span>
|
|
uint32_t x2 <span class="sy1">=</span> x0 <span class="sy3">&</span> ~mask<span class="sy4">;</span>
|
|
uint32_t x3 <span class="sy1">=</span> x0 <span class="sy3">&</span> mask<span class="sy4">;</span>
|
|
uint32_t x4 <span class="sy1">=</span> x0 <span class="sy3">^</span> mask<span class="sy4">;</span>
|
|
uint32_t x5 <span class="sy1">=</span> ~x0<span class="sy4">;</span>
|
|
<span class="kw1">using</span> bin16 <span class="sy1">=</span> <a href="cpp-utility-bitset.html"><span class="kw1027">std::<span class="me2">bitset</span></span></a><span class="sy1"><</span><span class="nu0">16</span><span class="sy1">></span><span class="sy4">;</span>
|
|
<span class="kw1">using</span> bin32 <span class="sy1">=</span> <a href="cpp-utility-bitset.html"><span class="kw1027">std::<span class="me2">bitset</span></span></a><span class="sy1"><</span><span class="nu0">32</span><span class="sy1">></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> <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-showbase.html"><span class="kw1766">std::<span class="me2">showbase</span></span></a>
|
|
<span class="sy1"><<</span> <span class="st0">"<span class="es3">\u3000</span><span class="es3">\u3000</span>掩码: "</span> <span class="sy1"><<</span> mask <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">39</span><span class="br0">)</span> <span class="sy1"><<</span> bin16<span class="br0">(</span>mask<span class="br0">)</span> <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span>
|
|
<span class="sy1"><<</span> <span class="st0">"<span class="es3">\u3000</span><span class="es3">\u3000</span><span class="es3">\u3000</span>值: "</span> <span class="sy1"><<</span> x0 <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">33</span><span class="br0">)</span> <span class="sy1"><<</span> bin32<span class="br0">(</span>x0<span class="br0">)</span> <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span>
|
|
<span class="sy1"><<</span> <span class="st0">"设置各位: "</span> <span class="sy1"><<</span> x1 <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">33</span><span class="br0">)</span> <span class="sy1"><<</span> bin32<span class="br0">(</span>x1<span class="br0">)</span> <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span>
|
|
<span class="sy1"><<</span> <span class="st0">"清除各位: "</span> <span class="sy1"><<</span> x2 <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">33</span><span class="br0">)</span> <span class="sy1"><<</span> bin32<span class="br0">(</span>x2<span class="br0">)</span> <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span>
|
|
<span class="sy1"><<</span> <span class="st0">"选择各位: "</span> <span class="sy1"><<</span> x3 <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">39</span><span class="br0">)</span> <span class="sy1"><<</span> bin32<span class="br0">(</span>x3<span class="br0">)</span> <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span>
|
|
<span class="sy1"><<</span> <span class="st0">"异或各位: "</span> <span class="sy1"><<</span> x4 <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">33</span><span class="br0">)</span> <span class="sy1"><<</span> bin32<span class="br0">(</span>x4<span class="br0">)</span> <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span>
|
|
<span class="sy1"><<</span> <span class="st0">"取反各位: "</span> <span class="sy1"><<</span> x5 <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">33</span><span class="br0">)</span> <span class="sy1"><<</span> bin32<span class="br0">(</span>x5<span class="br0">)</span> <span class="sy1"><<</span> <span class="st0">'<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">Mask: 0xf0 0000000011110000
|
|
Value: 0x12345678 00010010001101000101011001111000
|
|
Setting bits: 0x123456f8 00010010001101000101011011111000
|
|
Clearing bits: 0x12345608 00010010001101000101011000001000
|
|
Selecting bits: 0x70 00000000000000000000000001110000
|
|
XOR-ing bits: 0x12345688 00010010001101000101011010001000
|
|
Inverting bits: 0xedcba987 11101101110010111010100110000111</pre></div>
|
|
</div>
|
|
</div>
|
|
<h4><span class="mw-headline" id=".E7.A7.BB.E4.BD.8D.E8.BF.90.E7.AE.97.E7.AC.A6">移位运算符</span></h4>
|
|
<p>移位运算符表达式的形式为</p>
|
|
<table class="t-sdsc-begin">
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td><span class="t-spar">左操作数</span> <code><b><<</b></code> <span class="t-spar">右操作数</span></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><span class="t-spar">左操作数</span> <code><b>>></b></code> <span class="t-spar">右操作数</span></td>
|
|
<td>(2)</td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
</table>
|
|
<div class="t-li1"><span class="t-li">1)</span> 将 <span class="t-spar">左操作数</span> 左移 <span class="t-spar">右操作数</span> 位</div>
|
|
<div class="t-li1"><span class="t-li">2)</span> 将 <span class="t-spar">左操作数</span> 右移 <span class="t-spar">右操作数</span> 位</div>
|
|
<div class="t-li1"><span class="t-li"></span> 对于内建运算符,<span class="t-spar">左操作数</span> 和 <span class="t-spar">右操作数</span> 必须都具有整型或无作用域枚举类型。对两个运算数实施整型提升。</div>
|
|
<p>返回类型是提升后的左操作数的类型。</p>
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-until-cxx20">
|
|
<td>
|
|
<p>对于无符号 <code>a</code>,<code>a << b</code> 的值是 <span class="texhtml" style="white-space: nowrap;">a * 2<span class="t-su">b<br /></span></span> 对 <span class="texhtml" style="white-space: nowrap;">2<span class="t-su">N<br /></span></span> 取模,其中 <span class="texhtml" style="white-space: nowrap;">N</span> 是返回类型中的位数(即进行逐位左移并舍弃移出目标类型的位)。</p>
|
|
<p>对于有符号的非负 <code>a</code>,若 <span class="texhtml" style="white-space: nowrap;">a * 2<span class="t-su">b<br /></span></span> 能以返回类型的无符号版本表示,则将该值<a href="cpp-language-implicit_conversion.html#.E6.95.B4.E5.9E.8B.E8.BD.AC.E6.8D.A2">转换</a>到有符号后即是 <code>a << b</code> 的值(这使得以 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="nu0">1</span><span class="sy1"><<</span><span class="nu0">31</span></span></span> 创建 <span class="t-lc"><a href="cpp-types-climits.html">INT_MIN</a></span> 合法);否则行为未定义。</p>
|
|
<p>对于负 <code>a</code>,<code>a << b</code> 的行为未定义。</p>
|
|
<p>对于无符号 <code>a</code> 和有符号的非负 <code>a</code>,<code>a >> b</code> 的值是 <span class="texhtml" style="white-space: nowrap;">a/2<span class="t-su">b<br /></span></span> 的整数部分。</p>
|
|
<p>对于负 <code>a</code>,<code>a >> b</code> 的值是实现定义的(大多数平台上进行算术右移,故结果保留为负)。</p>
|
|
</td>
|
|
<td><span class="t-mark-rev t-until-cxx20">(C++20 前)</span></td>
|
|
</tr>
|
|
<tr class="t-rev t-since-cxx20">
|
|
<td>
|
|
<p><code>a << b</code> 的值是与 <span class="texhtml" style="white-space: nowrap;">a * 2<span class="t-su">b<br /></span></span> 对 <span class="texhtml" style="white-space: nowrap;">2<span class="t-su">N<br /></span></span> 同余的唯一值,其中 <span class="texhtml" style="white-space: nowrap;">N</span> 是返回类型中的位数(即进行逐位左移并舍弃移出目标类型的位)。</p>
|
|
<p><code>a >> b</code> 的值是 <span class="texhtml" style="white-space: nowrap;">a/2<span class="t-su">b<br /></span></span> 向下取整(换言之,有符号 <code>a</code> 上的右移是算术右移)。</p>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-cxx20">(C++20 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
<p>任何情况下,若右操作数的值为负或大于等于提升后左操作数中的位数,则行为未定义。</p>
|
|
<p>在<a href="cpp-language-overload_resolution.html#.E8.B0.83.E7.94.A8.E9.87.8D.E8.BD.BD.E8.BF.90.E7.AE.97.E7.AC.A6">针对用户定义运算符的重载决议</a>中,对于每对提升后的整型类型 <code>L</code> 和 <code>R</code>,下列函数签名参与重载决议:</p>
|
|
<table class="t-dcl-begin">
|
|
<tbody>
|
|
<tr class="t-dcl">
|
|
<td class="t-dcl-nopad">
|
|
<div><span class="mw-geshi cpp source-cpp">L operator<span class="sy1"><<</span><span class="br0">(</span>L, R<span class="br0">)</span></span></div>
|
|
</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
<td class="t-dcl-nopad"></td>
|
|
</tr>
|
|
<tr class="t-dcl">
|
|
<td class="t-dcl-nopad">
|
|
<div><span class="mw-geshi cpp source-cpp">L operator<span class="sy1">>></span><span class="br0">(</span>L, R<span class="br0">)</span></span></div>
|
|
</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
<td class="t-dcl-nopad"></td>
|
|
</tr>
|
|
<tr class="t-dcl-sep">
|
|
<td></td>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<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="kw2">enum</span> <span class="br0">{</span>ONE<span class="sy1">=</span><span class="nu0">1</span>, TWO<span class="sy1">=</span><span class="nu0">2</span><span class="br0">}</span><span class="sy4">;</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> <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-showbase.html"><span class="kw1766">std::<span class="me2">showbase</span></span></a><span class="sy4">;</span>
|
|
<span class="kw4">char</span> c <span class="sy1">=</span> <span class="nu12">0x10</span><span class="sy4">;</span>
|
|
<span class="kw4">unsigned</span> <span class="kw4">long</span> <span class="kw4">long</span> ull <span class="sy1">=</span> <span class="nu12">0x123</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">"0x123 << 1 = "</span> <span class="sy1"><<</span> <span class="br0">(</span>ull <span class="sy1"><<</span> <span class="nu0">1</span><span class="br0">)</span> <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span>
|
|
<span class="sy1"><<</span> <span class="st0">"0x123 << 63 = "</span> <span class="sy1"><<</span> <span class="br0">(</span>ull <span class="sy1"><<</span> <span class="nu0">63</span><span class="br0">)</span> <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span> <span class="co1">// 无符号中的溢出</span>
|
|
<span class="sy1"><<</span> <span class="st0">"0x10 << 10 = "</span> <span class="sy1"><<</span> <span class="br0">(</span>c <span class="sy1"><<</span> <span class="nu0">10</span><span class="br0">)</span> <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span><span class="sy4">;</span> <span class="co1">// 提升 char 到 int</span>
|
|
<span class="kw4">long</span> <span class="kw4">long</span> ll <span class="sy1">=</span> <span class="sy2">-</span><span class="nu0">1000</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> <a href="cpp-io-manip-hex.html"><span class="kw1781">std::<span class="me2">dec</span></span></a> <span class="sy1"><<</span> <span class="st0">"-1000 >> 1 = "</span> <span class="sy1"><<</span> <span class="br0">(</span>ll <span class="sy1">>></span> ONE<span class="br0">)</span> <span class="sy1"><<</span> <span class="st0">'<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">0x123 << 1 = 0x246
|
|
0x123 << 63 = 0x8000000000000000
|
|
0x10 << 10 = 0x4000
|
|
-1000 >> 1 = -500</pre></div>
|
|
</div>
|
|
</div>
|
|
<h3><span class="mw-headline" id=".E6.A0.87.E5.87.86.E5.BA.93">标准库</span></h3>
|
|
<p>许多标准库类型都重载了算术运算符。</p>
|
|
<h4><span class="mw-headline" id=".E4.B8.80.E5.85.83.E7.AE.97.E6.9C.AF.E8.BF.90.E7.AE.97.E7.AC.A6_2">一元算术运算符</span></h4>
|
|
<table class="t-dsc-begin">
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-chrono-duration-operator_arith.html"><span class="t-lines"><span>operator+</span><span>operator-</span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>实现一元 + 和一元 -<br />
|
|
<span class="t-mark">(<code>std::chrono::duration<Rep,Period></code> 的公开成员函数)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-numeric-complex-operator_arith2.html"><span class="t-lines"><span>operator+</span><span>operator-</span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>对复数运用一元运算符<br />
|
|
<span class="t-mark">(函数模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-numeric-valarray-operator_arith.html"><span class="t-lines"><span>operator+</span><span>operator-</span><span>operator~</span><span>operator!</span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>对 valarray 的每个元素运用一元算术运算符<br />
|
|
<span class="t-mark">(<code>std::valarray<T></code> 的公开成员函数)</span></td>
|
|
</tr>
|
|
</table>
|
|
<h4><span class="mw-headline" id=".E5.8A.A0.E6.80.A7.E8.BF.90.E7.AE.97.E7.AC.A6_2">加性运算符</span></h4>
|
|
<table class="t-dsc-begin">
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-chrono-time_point-operator_arith2.html"><span class="t-lines"><span>operator+</span><span>operator-</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>实施涉及时间点的加法和减法运算<br />
|
|
<span class="t-mark">(函数模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-chrono-duration-operator_arith4.html"><span class="t-lines"><span>operator+</span><span>operator-</span><span>operator*</span><span>operator/</span><span>operator%</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>实现以时长为实参的算术运算<br />
|
|
<span class="t-mark">(函数模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-chrono-year_month_day-operator_arith_2.html"><span class="t-lines"><span>operator+</span><span>operator-</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx20">(C++20)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>将 <code>year_month_day</code> 与一定量的年数或月数相加或相减<br />
|
|
<span class="t-mark">(函数)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-string-basic_string-operator+.html"><span class="t-lines"><span>operator+</span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>连接两个字符串或者一个字符串和一个字符<br />
|
|
<span class="t-mark">(函数模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-iterator-reverse_iterator-operator_arith.html"><span class="t-lines"><span>operator+</span><span>operator-</span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>推进或减小迭代器<br />
|
|
<span class="t-mark">(<code>std::reverse_iterator<Iter></code> 的公开成员函数)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-iterator-move_iterator-operator_arith.html"><span class="t-lines"><span>operator+</span><span>operator-</span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>推进或减小迭代器<br />
|
|
<span class="t-mark">(<code>std::move_iterator<Iter></code> 的公开成员函数)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-numeric-complex-operator_arith3.html"><span class="t-lines"><span>operator+</span><span>operator-</span><span>operator*</span><span>operator/</span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>在两个复数,或一个复数与一个标量上进行复数算术运算<br />
|
|
<span class="t-mark">(函数模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-numeric-valarray-operator_arith3.html"><span class="t-lines"><span>operator+</span><span>operator-</span><span>operator*</span><span>operator/</span><span>operator%</span><span>operator&</span><span>operator|</span><span>operator^</span><span>operator<<</span><span>operator>></span><span>operator&&</span><span>operator||</span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>对两个 valarray 的每个元素,或一个 valarray 的每个元素和一个值运用二元运算符<br />
|
|
<span class="t-mark">(函数模板)</span></td>
|
|
</tr>
|
|
</table>
|
|
<h4><span class="mw-headline" id=".E4.B9.98.E6.80.A7.E8.BF.90.E7.AE.97.E7.AC.A6_2">乘性运算符</span></h4>
|
|
<table class="t-dsc-begin">
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-chrono-duration-operator_arith4.html"><span class="t-lines"><span>operator+</span><span>operator-</span><span>operator*</span><span>operator/</span><span>operator%</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>实现以时长为实参的算术运算<br />
|
|
<span class="t-mark">(函数模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-numeric-complex-operator_arith3.html"><span class="t-lines"><span>operator+</span><span>operator-</span><span>operator*</span><span>operator/</span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>在两个复数,或一个复数与一个标量上进行复数算术运算<br />
|
|
<span class="t-mark">(函数模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-numeric-valarray-operator_arith3.html"><span class="t-lines"><span>operator+</span><span>operator-</span><span>operator*</span><span>operator/</span><span>operator%</span><span>operator&</span><span>operator|</span><span>operator^</span><span>operator<<</span><span>operator>></span><span>operator&&</span><span>operator||</span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>对两个 valarray 的每个元素,或一个 valarray 的每个元素和一个值运用二元运算符<br />
|
|
<span class="t-mark">(函数模板)</span></td>
|
|
</tr>
|
|
</table>
|
|
<h4><span class="mw-headline" id=".E9.80.90.E4.BD.8D.E9.80.BB.E8.BE.91.E8.BF.90.E7.AE.97.E7.AC.A6_2">逐位逻辑运算符</span></h4>
|
|
<table class="t-dsc-begin">
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-utility-bitset-operator_logic.html"><span class="t-lines"><span>operator&=</span><span>operator|=</span><span>operator^=</span><span>operator~</span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>进行二进制与、或、异或及非<br />
|
|
<span class="t-mark">(<code>std::bitset<N></code> 的公开成员函数)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-utility-bitset-operator_logic2.html"><span class="t-lines"><span>operator&</span><span>operator|</span><span>operator^</span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>在 bitset 上执行二元逻辑操作<br />
|
|
<span class="t-mark">(函数)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-numeric-valarray-operator_arith.html"><span class="t-lines"><span>operator~</span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>对 valarray 的每个元素运用一元算术运算符<br />
|
|
<span class="t-mark">(<code>std::valarray<T></code> 的公开成员函数)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-numeric-valarray-operator_arith3.html"><span class="t-lines"><span>operator^</span><span>operator&</span><span>operator|</span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>对两个 valarray 的每个元素,或一个 valarray 的每个元素和一个值运用二元运算符<br />
|
|
<span class="t-mark">(函数模板)</span></td>
|
|
</tr>
|
|
</table>
|
|
<h4><span class="mw-headline" id=".E7.A7.BB.E4.BD.8D.E8.BF.90.E7.AE.97.E7.AC.A6_2">移位运算符</span></h4>
|
|
<table class="t-dsc-begin">
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-numeric-valarray-operator_arith3.html"><span class="t-lines"><span>operator<<</span><span>operator>></span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>对两个 valarray 的每个元素,或一个 valarray 的每个元素和一个值运用二元运算符<br />
|
|
<span class="t-mark">(函数模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-utility-bitset-operator_ltltgtgt.html"><span class="t-lines"><span>operator<<</span><span>operator>></span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>进行二进制左移和右移<br />
|
|
<span class="t-mark">(<code>std::bitset<N></code> 的公开成员函数)</span></td>
|
|
</tr>
|
|
</table>
|
|
<h4><span class="mw-headline" id=".E6.B5.81.E6.8F.92.E5.85.A5.2F.E6.8A.BD.E5.8F.96.E8.BF.90.E7.AE.97.E7.AC.A6">流插入/抽取运算符</span></h4>
|
|
<p>整个标准库中,移位运算符常对 I/O 流( <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-io-ios_base.html"><span class="kw1669">std::<span class="me2">ios_base</span></span></a><span class="sy3">&</span></span></span> 或从它派生的类之一)重载,以之为左运算数和返回类型。这种运算符被称为<i>流插入</i>和<i>流抽取</i>运算符:</p>
|
|
<table class="t-dsc-begin">
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-io-basic_istream-operator_gtgt.html"><span class="t-lines"><span>operator>></span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>提取带格式数据<br />
|
|
<span class="t-mark">(<code>std::basic_istream<CharT,Traits></code> 的公开成员函数)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-io-basic_istream-operator_gtgt2.html"><span class="t-lines"><span>operator>><span class="t-dsc-small">(std::basic_istream)</span></span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>提取字符和字符数组<br />
|
|
<span class="t-mark">(函数模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-io-basic_ostream-operator_ltlt.html"><span class="t-lines"><span>operator<<</span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>插入带格式数据<br />
|
|
<span class="t-mark">(<code>std::basic_ostream<CharT,Traits></code> 的公开成员函数)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-io-basic_ostream-operator_ltlt2.html"><span class="t-lines"><span>operator<<<span class="t-dsc-small">(std::basic_ostream)</span></span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>插入字符数据<br />
|
|
<span class="t-mark">(函数)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-numeric-complex-operator_ltltgtgt.html"><span class="t-lines"><span>operator<<</span><span>operator>></span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>复数的序列化和反序列化<br />
|
|
<span class="t-mark">(函数模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-utility-bitset-operator_ltltgtgt2.html"><span class="t-lines"><span>operator<<</span><span>operator>></span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>执行 bitset 的流输入和输出<br />
|
|
<span class="t-mark">(函数)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-string-basic_string-operator_ltltgtgt.html"><span class="t-lines"><span>operator<<</span><span>operator>></span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>执行字符串的流输入与输出<br />
|
|
<span class="t-mark">(函数模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-numeric-random-linear_congruential_engine-operator_ltltgtgt.html"><span class="t-lines"><span>operator<<</span><span>operator>></span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>执行伪随机数引擎的流输入和输出<br />
|
|
<span class="t-mark">(函数)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-numeric-random-uniform_int_distribution-operator_ltltgtgt.html"><span class="t-lines"><span>operator<<</span><span>operator>></span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>执行伪随机数分布的流输入和输出<br />
|
|
<span class="t-mark">(函数模板)</span></td>
|
|
</tr>
|
|
</table>
|
|
<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/issue1457">CWG 1457</a></td>
|
|
<td>C++98</td>
|
|
<td>将正的有符号值的最左端的 <code>1</code> 位移入符号位为未定义行为</td>
|
|
<td>使之为良定义</td>
|
|
</tr>
|
|
</table>
|
|
<h3><span class="mw-headline" id=".E5.8F.82.E9.98.85">参阅</span></h3>
|
|
<p><a href="cpp-language-operator_precedence.html">运算符优先级</a></p>
|
|
<p><a href="cpp-language-operators.html">运算符重载</a></p>
|
|
<table class="wikitable">
|
|
<tr style="text-align:center">
|
|
<th colspan="7">常见运算符</th>
|
|
</tr>
|
|
<tr style="text-align:center">
|
|
<td><a href="cpp-language-operator_assignment.html">赋值</a></td>
|
|
<td><a href="cpp-language-operator_incdec.html">自增<br />
|
|
自减</a></td>
|
|
<td><strong class="selflink">算术</strong></td>
|
|
<td><a href="cpp-language-operator_logical.html">逻辑</a></td>
|
|
<td><a href="cpp-language-operator_comparison.html">比较</a></td>
|
|
<td><a href="cpp-language-operator_member_access.html">成员访问</a></td>
|
|
<td><a href="cpp-language-operator_other.html">其他</a></td>
|
|
</tr>
|
|
<tr style="text-align:center">
|
|
<td>
|
|
<p><span class="t-c"><span class="mw-geshi cpp source-cpp">a <span class="sy1">=</span> b<br />
|
|
a <span class="sy2">+</span><span class="sy1">=</span> b<br />
|
|
a <span class="sy2">-</span><span class="sy1">=</span> b<br />
|
|
a <span class="sy2">*</span><span class="sy1">=</span> b<br />
|
|
a <span class="sy2">/</span><span class="sy1">=</span> b<br />
|
|
a <span class="sy2">%</span><span class="sy1">=</span> b<br />
|
|
a <span class="sy3">&</span><span class="sy1">=</span> b<br />
|
|
a <span class="sy3">|</span><span class="sy1">=</span> b<br />
|
|
a <span class="sy3">^</span><span class="sy1">=</span> b<br />
|
|
a <span class="sy1"><<=</span> b<br />
|
|
a <span class="sy1">>>=</span> b</span></span></p>
|
|
</td>
|
|
<td>
|
|
<p><span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="sy2">++</span>a<br />
|
|
<span class="sy2">--</span>a<br />
|
|
a<span class="sy2">++</span><br />
|
|
a<span class="sy2">--</span></span></span></p>
|
|
</td>
|
|
<td>
|
|
<p><span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="sy2">+</span>a<br />
|
|
<span class="sy2">-</span>a<br />
|
|
a <span class="sy2">+</span> b<br />
|
|
a <span class="sy2">-</span> b<br />
|
|
a <span class="sy2">*</span> b<br />
|
|
a <span class="sy2">/</span> b<br />
|
|
a <span class="sy2">%</span> b<br />
|
|
~a<br />
|
|
a <span class="sy3">&</span> b<br />
|
|
a <span class="sy3">|</span> b<br />
|
|
a <span class="sy3">^</span> b<br />
|
|
a <span class="sy1"><<</span> b<br />
|
|
a <span class="sy1">>></span> b</span></span></p>
|
|
</td>
|
|
<td>
|
|
<p><span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="sy3">!</span>a<br />
|
|
a <span class="sy3">&&</span> b<br />
|
|
a <span class="sy3">||</span> b</span></span></p>
|
|
</td>
|
|
<td>
|
|
<p><span class="t-c"><span class="mw-geshi cpp source-cpp">a <span class="sy1">==</span> b<br />
|
|
a <span class="sy3">!</span><span class="sy1">=</span> b<br />
|
|
a <span class="sy1"><</span> b<br />
|
|
a <span class="sy1">></span> b<br />
|
|
a <span class="sy1"><=</span> b<br />
|
|
a <span class="sy1">>=</span> b<br />
|
|
a <span class="sy1"><=></span> b</span></span></p>
|
|
</td>
|
|
<td>
|
|
<p><span class="t-c"><span class="mw-geshi cpp source-cpp">a<span class="br0">[</span>b<span class="br0">]</span><br />
|
|
<span class="sy2">*</span>a<br />
|
|
<span class="sy3">&</span>a<br />
|
|
a<span class="sy2">-</span><span class="sy1">></span>b<br />
|
|
a.<span class="me1">b</span><br />
|
|
a<span class="sy2">-</span><span class="sy1">></span><span class="sy2">*</span>b<br />
|
|
a.<span class="sy2">*</span>b</span></span></p>
|
|
</td>
|
|
<td>
|
|
<p><span class="t-c"><span class="mw-geshi cpp source-cpp">a<span class="br0">(</span>...<span class="br0">)</span><br />
|
|
a, b<br />
|
|
<span class="sy4">?</span> <span class="sy4">:</span></span></span></p>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<th colspan="7">特殊运算符</th>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="7">
|
|
<p><a href="cpp-language-static_cast.html"><tt>static_cast</tt></a> 转换一个类型为另一相关类型<br />
|
|
<a href="cpp-language-dynamic_cast.html"><tt>dynamic_cast</tt></a> 在继承层级中转换<br />
|
|
<a href="cpp-language-const_cast.html"><tt>const_cast</tt></a> 添加或移除 <a href="cpp-language-cv.html">cv</a> 限定符<br />
|
|
<a href="cpp-language-reinterpret_cast.html"><tt>reinterpret_cast</tt></a> 转换类型到无关类型<br />
|
|
<a href="cpp-language-explicit_cast.html">C 风格转型</a> 以 <code>static_cast</code> 、 <code>const_cast</code> 及 <code>reinterpret_cast</code> 的混合转换一个类型到另一类型<br />
|
|
<a href="cpp-language-new.html"><tt>new</tt></a> 创建有动态存储期的对象<br />
|
|
<a href="cpp-language-delete.html"><tt>delete</tt></a> 销毁先前由 new 表达式创建的对象,并释放其所拥有的内存区域<br />
|
|
<a href="cpp-language-sizeof.html"><tt>sizeof</tt></a> 查询类型的大小<br />
|
|
<a href="cpp-language-sizeof....html"><tt>sizeof...</tt></a> 查询<a href="cpp-language-parameter_pack.html">形参包</a>的大小<span class="t-mark-rev t-since-cxx11">(C++11 起)</span><br />
|
|
<a href="cpp-language-typeid.html"><tt>typeid</tt></a> 查询类型的类型信息<br />
|
|
<a href="cpp-language-noexcept.html"><tt>noexcept</tt></a> 查询表达式是否能抛出异常<span class="t-mark-rev t-since-cxx11">(C++11 起)</span><br />
|
|
<a href="cpp-language-alignof.html"><tt>alignof</tt></a> 查询类型的对齐要求<span class="t-mark-rev t-since-cxx11">(C++11 起)</span></p>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
<table class="t-dsc-begin"></table>
|
|
</div>
|
|
<div class="visualClear"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|