277 lines
16 KiB
HTML
277 lines
16 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_operator_incdec 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">
|
|
<p>自增/自减运算符是使对象的值增加/减少 1 的一元运算符。</p>
|
|
<p>它们能拥有后缀形式:</p>
|
|
<table class="t-sdsc-begin">
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td class="t-sdsc-nopad"><span class="t-spar">expr</span> <code><b>++</b></code></td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td class="t-sdsc-nopad"><span class="t-spar">expr</span> <code><b>--</b></code></td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
</table>
|
|
<p>还有前缀形式:</p>
|
|
<table class="t-sdsc-begin">
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td class="t-sdsc-nopad"><code><b>++</b></code> <span class="t-spar">expr</span></td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td class="t-sdsc-nopad"><code><b>--</b></code> <span class="t-spar">expr</span></td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
</table>
|
|
<p>前缀和后缀自增或自减的运算数 <span class="t-spar">expr</span> 必须为<a href="c-language-type.html" class="mw-redirect">整数类型</a>(包含 <code>_Bool</code> 和枚举)、实浮点类型或指针类型的<a href="c-language-value_category.html">可修改左值</a>。它能为 cvr 限定、无限定或为<a href="c-language-atomic.html">原子</a>。</p>
|
|
<p>后缀自增和自减运算符的结果是 <span class="t-spar">expr</span> 的值。</p>
|
|
<p>前缀自增运算符的结果是将值 <code>1</code> 加到 <span class="t-spar">expr</span> 的值的结果:表达式 <span class="t-c"><span class="mw-geshi c source-c"><span class="sy2">++</span>e</span></span> 等价于 <span class="t-c"><span class="mw-geshi c source-c">e<span class="sy2">+</span><span class="sy1">=</span><span class="nu0">1</span></span></span> 。前缀自减运算符的结果从 <span class="t-spar">expr</span> 减去值 <code>1</code> 的结果:表达式 <span class="t-c"><span class="mw-geshi c source-c"><span class="sy2">--</span>e</span></span> 等价于 <span class="t-c"><span class="mw-geshi c source-c">e<span class="sy2">-</span><span class="sy1">=</span><span class="nu0">1</span></span></span> 。</p>
|
|
<p>自增运算符发动加相应类型的值 <code>1</code> 到运算数的副效应。自减运算符发动从运算数减去相应类型的值 <code>1</code> 的副效应。同其他副效应,这些操作在下个<a href="c-language-eval_order.html">序列点</a>或那之前完成。</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="c source-c">
|
|
<pre class="de1"><span class="kw4">int</span> a <span class="sy1">=</span> <span class="nu0">1</span><span class="sy4">;</span>
|
|
<span class="kw4">int</span> b <span class="sy1">=</span> a<span class="sy2">++</span><span class="sy4">;</span> <span class="co1">// 存储 1+a (即 2 )到 a</span>
|
|
<span class="co1">// 返回 a 的值(即 1 )</span>
|
|
<span class="co1">// 此行后, b == 1 而 a == 2</span>
|
|
a <span class="sy1">=</span> <span class="nu0">1</span><span class="sy4">;</span>
|
|
<span class="kw4">int</span> c <span class="sy1">=</span> <span class="sy2">++</span>a<span class="sy4">;</span> <span class="co1">// 存储 1+a (即 2 )到 a</span>
|
|
<span class="co1">// 返回 1+a (即 2 )</span>
|
|
<span class="co1">// 此行后, c == 2 而 a == 2</span></pre></div>
|
|
</div>
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-since-c11">
|
|
<td>
|
|
<p>任何<a href="c-language-atomic.html">原子对象</a>上的后自增或后自减运算符,是拥有 <span class="t-lc"><a href="c-atomic-memory_order.html">memory_order_seq_cst</a></span> 内存顺序的原子读修改写操作。</p>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-c11">(C11 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
<p>指针算术上的限制,还有应用于运算数的隐式转换见<a href="c-language-operator_arithmetic.html">算术运算符</a>。</p>
|
|
<h3><span class="mw-headline" id=".E6.B3.A8.E6.84.8F">注意</span></h3>
|
|
<p>因为涉及副效应,必须谨慎地使用自增和自减运算符,以避免违背<a href="c-language-eval_order.html">定序规则</a>所致的未定义行为。</p>
|
|
<p>自增/自减运算符不对复数或虚数类型定义:加/减实数 1 的通常定义对虚数会无效,而使之对虚数加/减 <code>i</code> 但对复数加/减 <code>1</code> ,会使得处理 <code>0+yi</code> 和 <code>yi</code> 的方式有别。</p>
|
|
<p>不同于 C++ (和 C 的某些实现),自增/自减运算符自身决非左值: <span class="t-c"><span class="mw-geshi c source-c"><span class="sy3">&</span><span class="sy2">++</span>a</span></span> 是非法的。</p>
|
|
<h3><span class="mw-headline" id=".E7.A4.BA.E4.BE.8B">示例</span></h3>
|
|
<div class="t-example">
|
|
<div class="t-example-live-link"></div>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="c source-c">
|
|
<pre class="de1"><span class="co2">#include <stdlib.h></span>
|
|
<span class="co2">#include <stdio.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>
|
|
|
|
<span class="kw4">int</span> a <span class="sy1">=</span> <span class="nu0">1</span><span class="sy4">;</span>
|
|
<span class="kw4">int</span> b <span class="sy1">=</span> <span class="nu0">1</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>
|
|
<a href="c-io-fprintf.html"><span class="kw851">printf</span></a><span class="br0">(</span><span class="st0">"original values: a == %d, b == %d<span class="es1">\n</span>"</span>, a, b<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">"result of postfix operators: a++ == %d, b-- == %d<span class="es1">\n</span>"</span>, a<span class="sy2">++</span>, b<span class="sy2">--</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">"after postfix operators applied: a == %d, b == %d<span class="es1">\n</span>"</span>, a, b<span class="br0">)</span><span class="sy4">;</span>
|
|
|
|
<span class="co1">// 重置 a 与 b 。</span>
|
|
a <span class="sy1">=</span> <span class="nu0">1</span><span class="sy4">;</span>
|
|
b <span class="sy1">=</span> <span class="nu0">1</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>
|
|
<a href="c-io-fprintf.html"><span class="kw851">printf</span></a><span class="br0">(</span><span class="st0">"original values: a == %d, b == %d<span class="es1">\n</span>"</span>, a, b<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">"result of prefix operators: ++a == %d, --b == %d<span class="es1">\n</span>"</span>, <span class="sy2">++</span>a, <span class="sy2">--</span>b<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">"after prefix operators applied: a == %d, b == %d<span class="es1">\n</span>"</span>, a, b<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">original values: a == 1, b == 1
|
|
result of postfix operators: a++ == 1, b-- == 1
|
|
after postfix operators applied: a == 2, b == 0
|
|
|
|
original values: a == 1, b == 1
|
|
result of prefix operators: ++a == 2, --b == 0
|
|
after prefix operators applied: a == 2, b == 0</pre></div>
|
|
</div>
|
|
</div>
|
|
<h3><span class="mw-headline" id=".E5.BC.95.E7.94.A8">引用</span></h3>
|
|
<div class="t-ref-std-11">
|
|
<ul>
|
|
<li>C11 标准(ISO/IEC 9899:2011):</li>
|
|
</ul>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>6.5.2.4 Postfix increment and decrement operators (p: 85)</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>6.5.3.1 Prefix increment and decrement operators (p: 88)</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
<div class="t-ref-std-c99">
|
|
<ul>
|
|
<li>C99 标准(ISO/IEC 9899:1999):</li>
|
|
</ul>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>6.5.2.4 Postfix increment and decrement operators (p: 75)</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>6.5.3.1 Prefix increment and decrement operators (p: 78)</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
<div class="t-ref-std-c89">
|
|
<ul>
|
|
<li>C89/C90 标准(ISO/IEC 9899:1990):</li>
|
|
</ul>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>3.3.2.4 Postfix increment and decrement operators</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>3.3.3.1 Prefix increment and decrement operators</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
</div>
|
|
<h3><span class="mw-headline" id=".E5.8F.82.E9.98.85">参阅</span></h3>
|
|
<p><a href="c-language-operator_precedence.html">运算符优先级</a></p>
|
|
<table class="wikitable">
|
|
<tr style="text-align:center">
|
|
<th colspan="7">常用运算符</th>
|
|
</tr>
|
|
<tr style="text-align:center">
|
|
<td><a href="c-language-operator_assignment.html">赋值</a></td>
|
|
<td><strong class="selflink">自增<br />
|
|
自减</strong></td>
|
|
<td><a href="c-language-operator_arithmetic.html">算术</a></td>
|
|
<td><a href="c-language-operator_logical.html">逻辑</a></td>
|
|
<td><a href="c-language-operator_comparison.html">比较</a></td>
|
|
<td><a href="c-language-operator_member_access.html">成员<br />
|
|
访问</a></td>
|
|
<td><a href="c-language-operator_other.html">其他</a></td>
|
|
</tr>
|
|
<tr style="text-align:center">
|
|
<td>
|
|
<p><span class="t-c"><span class="mw-geshi c source-c">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 c source-c"><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 c source-c"><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 c source-c"><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 c source-c">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</span></span></p>
|
|
</td>
|
|
<td>
|
|
<p><span class="t-c"><span class="mw-geshi c source-c">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></span></span></p>
|
|
</td>
|
|
<td>
|
|
<p><span class="t-c"><span class="mw-geshi c source-c">a<span class="br0">(</span>...<span class="br0">)</span><br />
|
|
a, b<br />
|
|
<span class="br0">(</span>type<span class="br0">)</span> a<br />
|
|
<span class="sy4">?</span> <span class="sy4">:</span><br />
|
|
<span class="kw4">sizeof</span><br />
|
|
_Alignof</span></span> <span class="t-mark-rev t-since-c11">(C11 起)</span></p>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
<table class="t-dsc-begin"></table>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="visualClear"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|