127 lines
14 KiB
HTML
127 lines
14 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_value_category 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>C中每个<a href="c-language-expressions.html">表达式</a>(带有参数的运算符、函数调用、常量、变量名等)以两个独立属性刻画:<a href="c-language-types.html">类型</a>和<a href="c-language-expressions.html#.E7.BB.BC.E8.BF.B0">值类别</a>。</p>
|
|
<p>每个表达式属于三个值类别之一:左值、非左值对象(右值)以及函数指代器。</p>
|
|
<h3><span class="mw-headline" id=".E5.B7.A6.E5.80.BC.E8.A1.A8.E8.BE.BE.E5.BC.8F">左值表达式</span></h3>
|
|
<p>左值表达式是任何类型异于 <code>void</code> 的<a href="c-language-type.html#.E7.B1.BB.E5.9E.8B.E7.BB.84.E5.88.AB" class="mw-redirect">对象类型</a>,且隐含地指代一个<a href="c-language-object.html">对象</a>的表达式(当左值在求值时不实际指代一个对象时,行为未定义)。换言之,左值表达式求值得到<i>对象标识</i>。此值类别的名称(“左值”)是历史性的,并反映了 CPL 中,左值表达式作为赋值运算符的左运算数。</p>
|
|
<p>左值表达式可用于下列<i>左值语境</i>:</p>
|
|
<ul>
|
|
<li>作为<a href="c-language-operator_member_access.html">取址运算符</a>的运算数(除了指代<a href="c-language-bit_field.html">位域</a>或声明为<a href="c-language-storage_duration.html">register</a>的左值)。</li>
|
|
<li>作为前/后<a href="c-language-operator_incdec.html">自增减运算符</a>的运算数。</li>
|
|
<li>作为<a href="c-language-operator_member_access.html">成员访问</a>(点)运算符的左运算数。</li>
|
|
<li>作为<a href="c-language-operator_assignment.html">赋值及复合赋值</a>运算符的左运算数。</li>
|
|
</ul>
|
|
<p>若将左值表达式用于异于 <a href="c-language-sizeof.html"><code>sizeof</code></a> 、 <a href="c-language-_Alignof.html"><code>_Alignof</code></a> 或上述的运算符,则任何完整类型的非数组左值会经历<a href="c-language-conversion.html">左值转换</a>,这模仿的是从对象位置到其值的内存加载。同样地,在用于异于 <code>sizeof</code> 、 <code>_Alignof</code> 、取址运算符或从字符串字面量初始化数组的语境时,数组左值会经历<a href="c-language-conversion.html">数组到指针转换</a>。</p>
|
|
<p><a href="c-language-const.html"><code>const</code></a>/<a href="c-language-volatile.html"><code>volatile</code></a>/<a href="c-language-restrict.html"><code>restrict</code></a> 限定符和<a href="c-language-atomic.html">原子</a>类型的语义仅应用于左值(左值转换将剥除限定符并移除原子属性)。</p>
|
|
<p>下列表达式是左值:</p>
|
|
<ul>
|
|
<li>标识符,含具名函数形参,只要声明它们为指代对象(而非函数)</li>
|
|
<li><a href="c-language-string_literal.html">字符串字面量</a></li>
|
|
<li><span class="t-mark-rev t-since-c99">(C99)</span> <a href="c-language-compound_literal.html">复合字面量</a></li>
|
|
<li>括号表达式,若其无括号版本是左值</li>
|
|
<li>成员访问(点)运算符的结果,若其左参数是左值</li>
|
|
<li>由指针访问成员( <code><b>-></b></code> )运算符的结果</li>
|
|
<li>间接使用运算符(一元 <code><b>*</b></code> )作用域指向对象指针</li>
|
|
<li>下标运算符的结果( <code><b>[]</b></code> )</li>
|
|
</ul>
|
|
<h4><span class="mw-headline" id=".E5.8F.AF.E4.BF.AE.E6.94.B9.E5.B7.A6.E5.80.BC.E8.A1.A8.E8.BE.BE.E5.BC.8F">可修改左值表达式</span></h4>
|
|
<p>一个<i>可修改左值</i>是任何完整类型、非数组、且非 <a href="c-language-const.html">const</a> 限定的左值表达式,而且若它是结构体/联合体,则递归地没有任何成员为 <a href="c-language-const.html">const</a> 限定。</p>
|
|
<p>只有可修改左值表达式可用作自增减运算符的参数,赋值和复合赋值运算符的左参数。</p>
|
|
<h3><span class="mw-headline" id=".E9.9D.9E.E5.B7.A6.E5.80.BC.E5.AF.B9.E8.B1.A1.E8.A1.A8.E8.BE.BE.E5.BC.8F">非左值对象表达式</span></h3>
|
|
<p>通称为<i>右值</i>,非左值表达式是不指代对象的对象类型表达式,而是没有对象身份或存储位置的值。不能对非左值表达式取址。</p>
|
|
<p>下列表达式是非左值对象表达式:</p>
|
|
<ul>
|
|
<li>整数、字符、浮点数常量</li>
|
|
<li>所有不返回左值的运算符,包括</li>
|
|
</ul>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>任何函数表达式</li>
|
|
<li>任何转换类型表达式(注意看起来相似的复合字面量是左值)</li>
|
|
<li>作用于非左值结构体/联合体的的成员访问(点)运算符,<span class="t-c"><span class="mw-geshi c source-c">f<span class="br0">(</span><span class="br0">)</span>.<span class="me1">x</span></span></span>、 <span class="t-c"><span class="mw-geshi c source-c"><span class="br0">(</span>x,s1<span class="br0">)</span>.<span class="me1">a</span></span></span>、 <span class="t-c"><span class="mw-geshi c source-c"><span class="br0">(</span>s1<span class="sy1">=</span>s2<span class="br0">)</span>.<span class="me1">m</span></span></span></li>
|
|
<li>所有算术、关系、逻辑及位运算符</li>
|
|
<li>自增和自减运算符(注意:前置形式在 C++ 中是左值)</li>
|
|
<li>赋值及复合赋值运算符(注意:它们在 C++ 中是左值)</li>
|
|
<li>条件运算符(注意:在 C++ 中可能是左值)</li>
|
|
<li>逗号运算符(注意:在 C++ 中可能是左值)</li>
|
|
<li>取址运算符,即使它被用一元 <code><b>*</b></code> 运算符的结果中和</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
<p>作为特殊情况, <code>void</code> 类型表达式被假设成非左值对象表达式,得出一个不存在表示且不要求存储的值。</p>
|
|
<p>注意,拥有一个数组类型成员(可以是嵌套的)的结构体/联合体右值实际上指代一个拥有<a href="c-language-lifetime.html">临时生存期</a>的对象。此对象可通过由索引数组元素组成的左值表达式,或解引用该数组的数组到指针转换所得的指针访问。</p>
|
|
<h3><span class="mw-headline" id=".E5.87.BD.E6.95.B0.E6.8C.87.E4.BB.A3.E5.99.A8.E8.A1.A8.E8.BE.BE.E5.BC.8F">函数指代器表达式</span></h3>
|
|
<p>函数指代器(由<a href="c-language-function_declaration.html">函数声明</a>引入的标识符)是函数类型的表达式。当在异于取址运算符、 <a href="c-language-sizeof.html"><code>sizeof</code></a> 及 <a href="c-language-_Alignof.html"><code>_Alignof</code></a> (后两者在作用于函数时生成编译错误)的语境中时,函数指代器始终转换成指向函数的非左值指针。注意函数调用运算符是对指向函数指针,而非对函数指代器自身定义的。</p>
|
|
<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.3.2.1 Lvalues, arrays, and function designators (p: 40)</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.3.2.1 Lvalues, arrays, and function designators (p: 54-55)</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.3.2.1 Lvalues, arrays, and function designators (p: 46)</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.2.2.1 Lvalues and function designators</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>
|