266 lines
18 KiB
HTML
266 lines
18 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="zh" dir="ltr" class="client-nojs" xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh">
|
|
<head><meta http-equiv="x-ua-compatible" content="ie=edge">
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
|
<title>表达式</title>
|
|
<link rel="stylesheet" href="ext.css" />
|
|
<link rel="stylesheet" href="site_modules.css" />
|
|
</head>
|
|
<body class="mediawiki ltr sitedir-ltr ns-0 ns-subject page-c_language_expressions 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>表达式是<i>运算符</i>及其<i>操作数</i>的序列,它指定一个运算。</p>
|
|
<p>表达式求值可以产生结果(例如求值 <span class="t-c"><span class="mw-geshi c source-c"><span class="nu0">2</span><span class="sy2">+</span><span class="nu0">2</span></span></span> 产生结果 <span class="t-c"><span class="mw-geshi c source-c"><span class="nu0">4</span></span></span> ,可能产生副效应(例如求值 <span class="t-c"><span class="mw-geshi c source-c"><a href="c-io-fprintf.html"><span class="kw851">printf</span></a><span class="br0">(</span><span class="st0">"%d"</span>,<span class="nu0">4</span><span class="br0">)</span></span></span> 会将字符 <span class="t-c"><span class="mw-geshi c source-c"><span class="st0">'4'</span></span></span> 送到标准输出流),并可以指代对象或函数。</p>
|
|
<h4><span class="mw-headline" id=".E7.BB.BC.E8.BF.B0">综述</span></h4>
|
|
<ul>
|
|
<li><a href="c-language-value_category.html">值类别</a>(左值、非左值对象、函数指代器)将表达式以其值分类</li>
|
|
<li>参数和子表达式的<a href="c-language-eval_order.html">求值顺序</a>指定会得到何种中间结果</li>
|
|
</ul>
|
|
<h3><span class="mw-headline" id=".E8.BF.90.E7.AE.97.E7.AC.A6">运算符</span></h3>
|
|
<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><a href="c-language-operator_incdec.html">自增<br />
|
|
自减</a></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>
|
|
<ul>
|
|
<li><a href="c-language-operator_precedence.html">运算符优先级</a>定义运算符绑定到其参数的顺序</li>
|
|
<li><a href="c-language-operator_alternative.html">替用表示</a>是一些运算符的替用写法</li>
|
|
</ul>
|
|
<h4><span class="mw-headline" id=".E8.BD.AC.E6.8D.A2">转换</span></h4>
|
|
<ul>
|
|
<li><a href="c-language-conversion.html">隐式转换</a>在操作数类型不符合运算符期待时发生。</li>
|
|
<li><a href="c-language-cast.html">转型</a>可用于显示将值的类型从一个转到另一个。</li>
|
|
</ul>
|
|
<h4><span class="mw-headline" id=".E5.85.B6.E4.BB.96">其他</span></h4>
|
|
<ul>
|
|
<li><a href="c-language-constant_expression.html">常量表达式</a>可以在编译时求值,并用于编译时语境(<span class="t-rev-inl t-since-c99"><span>非 VLA</span> <span><span class="t-mark-rev t-since-c99">(C99 起)</span></span></span>数组大小、静态初始化器等)</li>
|
|
</ul>
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-since-c11">
|
|
<td>
|
|
<ul>
|
|
<li><a href="c-language-generic.html">泛型选择</a>可以根据参数类型调用不同的表达式</li>
|
|
</ul>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-c11">(C11 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-since-c99">
|
|
<td>
|
|
<ul>
|
|
<li>浮点表达式可能会引发浮点异常,并报告 <a href="c-numeric-math-math_errhandling.html"><tt>math_errhandling</tt></a> 中指定的错误</li>
|
|
<li>标准 <a href="c-preprocessor-impl.html">#pragma</a> : <code>FENV_ACCESS</code> 、 <code>FP_CONTRACT</code> 及 <code>CX_LIMITED_RANGE</code> 还有<a href="c-types-limits-FLT_EVAL_METHOD.html">浮点求值精度</a>和<a href="c-numeric-fenv-FE_round.html">舍入方向</a>控制浮点表达式求值方式。</li>
|
|
</ul>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-c99">(C99 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
<h3><span class="mw-headline" id=".E5.88.9D.E7.AD.89.E8.A1.A8.E8.BE.BE.E5.BC.8F">初等表达式</span></h3>
|
|
<p>运算符的操作数可为其他表达式,或<i>初等表达式</i>(例如 <span class="t-c"><span class="mw-geshi c source-c"><span class="nu0">1</span><span class="sy2">+</span><span class="nu0">2</span><span class="sy2">*</span><span class="nu0">3</span></span></span> 中,运算符 + 的操作数是子表达式 <span class="t-c"><span class="mw-geshi c source-c"><span class="nu0">2</span><span class="sy2">*</span><span class="nu0">3</span></span></span> 和初等表达式 <span class="t-c"><span class="mw-geshi c source-c"><span class="nu0">1</span></span></span> )。</p>
|
|
<p>初等表达式可以是下列之一:</p>
|
|
<div class="t-li1"><span class="t-li">1)</span> 常量及字面量(例如 <span class="t-c"><span class="mw-geshi c source-c"><span class="nu0">2</span></span></span> 或 <span class="t-c"><span class="mw-geshi c source-c"><span class="st0">"Hello, world"</span></span></span> )</div>
|
|
<div class="t-li1"><span class="t-li">2)</span> 适合的已声明<a href="c-language-identifier.html">标识符</a>(例如 <span class="t-c"><span class="mw-geshi c source-c">n</span></span> 或 <span class="t-c"><span class="mw-geshi c source-c"><a href="c-io-fprintf.html"><span class="kw851">printf</span></a></span></span> )</div>
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-since-c11">
|
|
<td>
|
|
<div class="t-li1"><span class="t-li">3)</span> <a href="c-language-generic.html">泛型选择</a></div>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-c11">(C11 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
<p>任何在括号中的表达式亦被分类为基础表达式:这保证括号拥有高于任何运算符的优先级。</p>
|
|
<h4><span class="mw-headline" id=".E5.B8.B8.E9.87.8F.E5.8F.8A.E5.AD.97.E9.9D.A2.E9.87.8F">常量及字面量</span></h4>
|
|
<p>某些类型的常量值可用称为字面量(对于左值表达式)和常量(对于右值表达式)的特殊表达式嵌入到 C 程序源代码中,。</p>
|
|
<ul>
|
|
<li><a href="c-language-integer_constant.html">整数常量</a>是十进制、八进制或十六进制的整数类型数字。</li>
|
|
<li><a href="c-language-character_constant.html">字符常量</a>是 <span class="t-c"><span class="mw-geshi c source-c"><span class="kw4">int</span></span></span> 类型,适于转换到字符类型<span class="t-rev-inl t-since-c11"><span>、 <span class="t-c"><span class="mw-geshi c source-c">char16_t</span></span> 、 <span class="t-c"><span class="mw-geshi c source-c">char32_t</span></span></span> <span><span class="t-mark-rev t-since-c11">(C11 起)</span></span></span>或 <span class="t-c"><span class="mw-geshi c source-c"><span class="kw4">wchar_t</span></span></span> 类型的单个字符。</li>
|
|
<li><a href="c-language-floating_constant.html">浮点常量</a>是 <span class="t-c"><span class="mw-geshi c source-c"><span class="kw4">float</span></span></span> 、 <span class="t-c"><span class="mw-geshi c source-c"><span class="kw4">double</span></span></span> 或 <span class="t-c"><span class="mw-geshi c source-c"><span class="kw4">long</span> <span class="kw4">double</span></span></span> 类型值。</li>
|
|
<li><a href="c-language-string_literal.html">字符串字面量</a>是类型为 <span class="t-c"><span class="mw-geshi c source-c"><span class="kw4">char</span><span class="br0">[</span><span class="br0">]</span></span></span> <span class="t-rev-inl t-since-c11"><span>、 <span class="t-c"><span class="mw-geshi c source-c">char16_t<span class="br0">[</span><span class="br0">]</span></span></span> 、 <span class="t-c"><span class="mw-geshi c source-c">char32_t<span class="br0">[</span><span class="br0">]</span></span></span></span> <span><span class="t-mark-rev t-since-c11">(C11 起)</span></span></span>或 <span class="t-c"><span class="mw-geshi c source-c"><span class="kw4">wchar_t</span><span class="br0">[</span><span class="br0">]</span></span></span> 的一系列字符,表示空终止字符串。</li>
|
|
</ul>
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-since-c99">
|
|
<td>
|
|
<ul>
|
|
<li><a href="c-language-compound_literal.html">复合字面量</a>是直接嵌入程序代码的结构体、联合体或数组类型的值。</li>
|
|
</ul>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-c99">(C99 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
<h3><span class="mw-headline" id=".E4.B8.8D.E6.B1.82.E5.80.BC.E8.A1.A8.E8.BE.BE.E5.BC.8F">不求值表达式</span></h3>
|
|
<p><a href="c-language-sizeof.html"><code>sizeof</code> 运算符</a>的操作数是不求值的表达式<span class="t-rev-inl t-since-c99"><span>(除非它们是 VLA )</span> <span><span class="t-mark-rev t-since-c99">(C99 起)</span></span></span>。故而 <span class="t-c"><span class="mw-geshi c source-c"><a href="c-types-size_t.html"><span class="kw100">size_t</span></a> n <span class="sy1">=</span> <span class="kw4">sizeof</span><span class="br0">(</span><a href="c-io-fprintf.html"><span class="kw851">printf</span></a><span class="br0">(</span><span class="st0">"%d"</span>, <span class="nu0">4</span><span class="br0">)</span><span class="br0">)</span><span class="sy4">;</span></span></span> 不会进行控制台输出。</p>
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-since-c11">
|
|
<td>
|
|
<p><a href="c-language-_Alignof.html"><code>_Alignof</code> 运算符</a>的操作数、<a href="c-language-generic.html">泛型选择</a>的控制表达式及作为 <code>_Alignof</code> 的操作数的 VLA 的大小表达式亦为不求值的表达式。</p>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-c11">(C11 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
<h3><span class="mw-headline" id=".E5.BC.95.E7.94.A8">引用</span></h3>
|
|
<div class="t-ref-std-17">
|
|
<ul>
|
|
<li>C17 标准(ISO/IEC 9899:2018):</li>
|
|
</ul>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>6.5 Expressions (p: 55-75)</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>6.6 Constant expressions (p: 76-77)</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
</div>
|
|
<div class="t-ref-std-11">
|
|
<ul>
|
|
<li>C11 标准(ISO/IEC 9899:2011):</li>
|
|
</ul>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>6.5 Expressions (p: 76-105)</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>6.6 Constant expressions (p: 106-107)</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
</div>
|
|
<div class="t-ref-std-c99">
|
|
<ul>
|
|
<li>C99 标准(ISO/IEC 9899:1999):</li>
|
|
</ul>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>6.5 Expressions (p: 67-94)</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>6.6 Constant expressions (p: 95-96)</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
</div>
|
|
<div class="t-ref-std-c89">
|
|
<ul>
|
|
<li>C89/C90 标准(ISO/IEC 9899:1990):</li>
|
|
</ul>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>3.3 EXPRESSIONS</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>3.4 CONSTANT EXPRESSIONS</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
</div>
|
|
<h3><span class="mw-headline" id=".E5.8F.82.E9.98.85">参阅</span></h3>
|
|
<table class="t-dsc-begin"></table>
|
|
</div>
|
|
<div class="visualClear"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|