280 lines
33 KiB
HTML
280 lines
33 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_struct_initialization 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><a href="c-language-initialization.html">初始化</a> <a href="c-language-struct.html">struct</a> 或 <a href="c-language-union.html">union</a> 类型对象时,初始化器必须是成员初始化器的非空、花括号环绕、逗号分隔的列表:</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> <code><b>{</b></code> <span class="t-spar">表达式</span> <code><b>,</b></code> <code><b>...</b></code> <code><b>}</b></code></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> <code><b>{</b></code> <span class="t-spar">指派符</span> <span class="t-spar">表达式</span> <code><b>,</b></code> <code><b>...</b></code> <code><b>}</b></code></td>
|
|
<td>(2)</td>
|
|
<td><span class="t-mark-rev t-since-c99">(C99 起)</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
</table>
|
|
<p>其中 <span class="t-spar">指派符</span> 是一序列(空白符分隔或相邻的) <code><b>.</b></code> <span class="t-spar">成员</span> 形式的单独成员指派符,和 <code><b>[</b></code> <span class="t-spar">下标</span> <code><b>]</b></code> 形式的<a href="c-language-array_initialization.html">数组指派符</a>。</p>
|
|
<p><a href="c-language-initialization.html#.E9.9A.90.E5.BC.8F.E5.88.9D.E5.A7.8B.E5.8C.96">隐式地初始化</a>所有未显式初始化的成员均被<a href="c-language-initialization.html#.E9.9B.B6.E5.88.9D.E5.A7.8B.E5.8C.96">零初始化</a>。</p>
|
|
<h3><span class="mw-headline" id=".E8.A7.A3.E9.87.8A">解释</span></h3>
|
|
<p>初始化 <a href="c-language-union.html">union</a> 时,初始化器列表必须只有一个成员,它初始化联合体的首个成员<span class="t-rev-inl t-since-c99"><span>,除非使用指派初始化器</span> <span><span class="t-mark-rev t-since-c99">(C99 起)</span></span></span>。</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="c source-c">
|
|
<pre class="de1"><span class="kw1">union</span> <span class="br0">{</span> <span class="kw4">int</span> x<span class="sy4">;</span> <span class="kw4">char</span> c<span class="br0">[</span><span class="nu0">4</span><span class="br0">]</span><span class="sy4">;</span> <span class="br0">}</span>
|
|
u <span class="sy1">=</span> <span class="br0">{</span><span class="nu0">1</span><span class="br0">}</span>, <span class="co1">// 令 u.x 活跃,拥有值 1</span>
|
|
u2 <span class="sy1">=</span> <span class="br0">{</span> .<span class="me1">c</span><span class="sy1">=</span><span class="br0">{</span><span class="st0">'<span class="es5">\1</span>'</span><span class="br0">}</span> <span class="br0">}</span><span class="sy4">;</span> <span class="co1">// 令 u2.c 活跃,拥有值 {'\1','\0','\0','\0'}</span></pre></div>
|
|
</div>
|
|
<p>初始化 <a href="c-language-struct.html">struct</a> 时,列表中的首个初始化器初始化首个被声明成员<span class="t-rev-inl t-since-c99"><span>(除非指定了指派符)</span> <span><span class="t-mark-rev t-since-c99">(C99 起)</span></span></span>,而所有后继的<span class="t-rev-inl t-since-c99"><span>无指派符</span> <span><span class="t-mark-rev t-since-c99">(C99 起)</span></span></span>初始化器,初始化先前表达式所初始化者之后的结构体成员。</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="c source-c">
|
|
<pre class="de1"><span class="kw1">struct</span> point <span class="br0">{</span><span class="kw4">double</span> x,y,z<span class="sy4">;</span><span class="br0">}</span> p <span class="sy1">=</span> <span class="br0">{</span><span class="nu16">1.2</span>, <span class="nu16">1.3</span><span class="br0">}</span><span class="sy4">;</span> <span class="co1">// p.x=1.2, p.y=1.3, p.z=0.0</span>
|
|
div_t answer <span class="sy1">=</span> <span class="br0">{</span>.<span class="me1">quot</span> <span class="sy1">=</span> <span class="nu0">2</span>, .<span class="me1">rem</span> <span class="sy1">=</span> <span class="sy2">-</span><span class="nu0">1</span> <span class="br0">}</span><span class="sy4">;</span> <span class="co1">// div_t 中的成员顺序可以不同</span></pre></div>
|
|
</div>
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-since-c99">
|
|
<td>
|
|
<p>指派符导致后随的初始化器初始化该指派符所描述的结构体成员。然后初始化继续按声明顺序向前,从指派符所描述成员的下个成员开始。</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="c source-c">
|
|
<pre class="de1"><span class="kw1">struct</span> <span class="br0">{</span><span class="kw4">int</span> sec,min,hour,day,mon,year<span class="sy4">;</span><span class="br0">}</span> z
|
|
<span class="sy1">=</span> <span class="br0">{</span>.<span class="me1">day</span><span class="sy1">=</span><span class="nu0">31</span>,<span class="nu0">12</span>,<span class="nu0">2014</span>,.<span class="me1">sec</span><span class="sy1">=</span><span class="nu0">30</span>,<span class="nu0">15</span>,<span class="nu0">17</span><span class="br0">}</span><span class="sy4">;</span> <span class="co1">// 初始化 z 为 {30,15,17,31,12,2014}</span></pre></div>
|
|
</div>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-c99">(C99 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
<p>提供多于成员的初始化器是错误。</p>
|
|
<h3><span class="mw-headline" id=".E5.B5.8C.E5.A5.97.E5.88.9D.E5.A7.8B.E5.8C.96">嵌套初始化</span></h3>
|
|
<p>若结构体或联合体的成员是数组、结构体或联合体,则初始化器的花括号环绕列表中的对应初始化器,是对这些成员合法的任何初始化器,除了可以以下列方式省略其括号:</p>
|
|
<p>若嵌套初始化器以左花括号开始,则直到其右花括号为止的整个嵌套初始化器,初始化对应的成员对象。每个左开花括号建立一个新的<i>当前对象</i>。当前对象的成员以其自然顺序初始化<span class="t-rev-inl t-since-c99"><span>,除非使用指派符</span> <span><span class="t-mark-rev t-since-c99">(C99 起)</span></span></span>:数组以下标顺序、结构体成员以声明顺序、仅初始化任何联合体的首个被声明成员。<a href="c-language-initialization.html#.E9.9B.B6.E5.88.9D.E5.A7.8B.E5.8C.96">零初始化</a>当前对象内未由闭花括号显式初始化的子对象。</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="c source-c">
|
|
<pre class="de1"><span class="kw1">struct</span> example <span class="br0">{</span>
|
|
<span class="kw1">struct</span> addr_t <span class="br0">{</span>
|
|
<a href="c-types-integer.html"><span class="kw122">uint32_t</span></a> port<span class="sy4">;</span>
|
|
<span class="br0">}</span> addr<span class="sy4">;</span>
|
|
<span class="kw1">union</span> <span class="br0">{</span>
|
|
<a href="c-types-integer.html"><span class="kw120">uint8_t</span></a> a8<span class="br0">[</span><span class="nu0">4</span><span class="br0">]</span><span class="sy4">;</span>
|
|
<a href="c-types-integer.html"><span class="kw121">uint16_t</span></a> a16<span class="br0">[</span><span class="nu0">2</span><span class="br0">]</span><span class="sy4">;</span>
|
|
<span class="br0">}</span> in_u<span class="sy4">;</span>
|
|
<span class="br0">}</span><span class="sy4">;</span>
|
|
<span class="kw1">struct</span> example ex <span class="sy1">=</span> <span class="br0">{</span> <span class="co1">// struct example 的初始化器列表开始</span>
|
|
<span class="br0">{</span> <span class="co1">// ex.addr 的初始化器列表开始</span>
|
|
<span class="nu0">80</span> <span class="co1">// 初始化 struct addr_t 的唯一成员</span>
|
|
<span class="br0">}</span>, <span class="co1">// ex.addr 的初始化器列表结束</span>
|
|
<span class="br0">{</span> <span class="co1">// ex.in_u 的初始化器列表开始</span>
|
|
<span class="br0">{</span><span class="nu0">127</span>,<span class="nu0">0</span>,<span class="nu0">0</span>,<span class="nu0">1</span><span class="br0">}</span> <span class="co1">// 初始化 union in_u 的首个成员</span>
|
|
<span class="br0">}</span> <span class="br0">}</span><span class="sy4">;</span></pre></div>
|
|
</div>
|
|
<p>若嵌套初始化器不以左花括号开始,则仅从列表采用足够的初始化器,以用于该成员数组、结构体或联合体的元素或成员;任何剩下的初始化器留待初始化下个结构体成员:</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="c source-c">
|
|
<pre class="de1"><span class="kw1">struct</span> example ex <span class="sy1">=</span> <span class="br0">{</span><span class="nu0">80</span>, <span class="nu0">127</span>, <span class="nu0">0</span>, <span class="nu0">0</span>, <span class="nu0">1</span><span class="br0">}</span><span class="sy4">;</span> <span class="co1">// 80 初始化 ex.addr.port</span>
|
|
<span class="co1">// 127 初始化 ex.in_u.a8[0]</span>
|
|
<span class="co1">// 0 初始化 ex.in_u.a8[1]</span>
|
|
<span class="co1">// 0 初始化 ex.in_u.a8[2]</span>
|
|
<span class="co1">// 1 初始化 ex.in_u.a8[3]</span></pre></div>
|
|
</div>
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-since-c99">
|
|
<td>
|
|
<p>嵌套指派符时,成员的指派符后随外围结构体/联合体/数组的指派符。在任何嵌套的方括号初始化器列表中,最外层指派符指代<i>当前对象</i>,而且只在<i>当前对象</i>中选择要初始化的子对象。</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="c source-c">
|
|
<pre class="de1"><span class="kw1">struct</span> example ex2 <span class="sy1">=</span> <span class="br0">{</span> <span class="co1">// 当前对象为 ex2 ,指派符属于 struct example 的成员</span>
|
|
.<span class="me1">in_u</span>.<span class="me1">a8</span><span class="br0">[</span><span class="nu0">0</span><span class="br0">]</span><span class="sy1">=</span><span class="nu0">127</span>, <span class="nu0">0</span>, <span class="nu0">0</span>, <span class="nu0">1</span>, .<span class="me1">addr</span><span class="sy1">=</span><span class="nu0">80</span><span class="br0">}</span><span class="sy4">;</span>
|
|
<span class="kw1">struct</span> example ex3 <span class="sy1">=</span> <span class="br0">{</span><span class="nu0">80</span>, .<span class="me1">in_u</span><span class="sy1">=</span><span class="br0">{</span> <span class="co1">// 更改当前对象为联合体 ex.in_u</span>
|
|
<span class="nu0">127</span>,
|
|
.<span class="me1">a8</span><span class="br0">[</span><span class="nu0">2</span><span class="br0">]</span><span class="sy1">=</span><span class="nu0">1</span> <span class="co1">// 此指派符指代 union in_u 的成员</span>
|
|
<span class="br0">}</span> <span class="br0">}</span><span class="sy4">;</span></pre></div>
|
|
</div>
|
|
<p>若显式初始化任何子对象二次(在使用指派符时可能发生),则使用的初始化器,是较后出现于列表中的初始化器(可能不求值较早的初始化器):</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="c source-c">
|
|
<pre class="de1"><span class="kw1">struct</span> <span class="br0">{</span><span class="kw4">int</span> n<span class="sy4">;</span><span class="br0">}</span> s <span class="sy1">=</span> <span class="br0">{</span><a href="c-io-fprintf.html"><span class="kw851">printf</span></a><span class="br0">(</span><span class="st0">"a<span class="es1">\n</span>"</span><span class="br0">)</span>, <span class="co1">// 可能打印或跳过它</span>
|
|
.<span class="me1">n</span><span class="sy1">=</span><a href="c-io-fprintf.html"><span class="kw851">printf</span></a><span class="br0">(</span><span class="st0">"b<span class="es1">\n</span>"</span><span class="br0">)</span><span class="br0">}</span><span class="sy4">;</span> <span class="co1">// 始终打印</span></pre></div>
|
|
</div>
|
|
<p>尽管任何未初始化的子对象都被隐式初始化,若子对象的显式初始化在初始化器列表中出现较早,则同一子对象的隐式初始化决不会覆盖显式初始化(选择 clang 以观察正确的输出):</p>
|
|
<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 <stdio.h></span>
|
|
<span class="kw1">typedef</span> <span class="kw1">struct</span> <span class="br0">{</span> <span class="kw4">int</span> k<span class="sy4">;</span> <span class="kw4">int</span> l<span class="sy4">;</span> <span class="kw4">int</span> a<span class="br0">[</span><span class="nu0">2</span><span class="br0">]</span><span class="sy4">;</span> <span class="br0">}</span> T<span class="sy4">;</span>
|
|
<span class="kw1">typedef</span> <span class="kw1">struct</span> <span class="br0">{</span> <span class="kw4">int</span> i<span class="sy4">;</span> T t<span class="sy4">;</span> <span class="br0">}</span> S<span class="sy4">;</span>
|
|
T x <span class="sy1">=</span> <span class="br0">{</span>.<span class="me1">l</span> <span class="sy1">=</span> <span class="nu0">43</span>, .<span class="me1">k</span> <span class="sy1">=</span> <span class="nu0">42</span>, .<span class="me1">a</span><span class="br0">[</span><span class="nu0">1</span><span class="br0">]</span> <span class="sy1">=</span> <span class="nu0">19</span>, .<span class="me1">a</span><span class="br0">[</span><span class="nu0">0</span><span class="br0">]</span> <span class="sy1">=</span> <span class="nu0">18</span> <span class="br0">}</span><span class="sy4">;</span>
|
|
<span class="co1">// 初始化 x 为 {42, 43, {18, 19} }</span>
|
|
<span class="kw4">int</span> main<span class="br0">(</span><span class="kw4">void</span><span class="br0">)</span>
|
|
<span class="br0">{</span>
|
|
S l <span class="sy1">=</span> <span class="br0">{</span> <span class="nu0">1</span>, <span class="co1">// 初始化 l.i 为 1</span>
|
|
.<span class="me1">t</span> <span class="sy1">=</span> x, <span class="co1">// 初始化 l.t 为 {42, 43, {18, 19} }</span>
|
|
.<span class="me1">t</span>.<span class="me1">l</span> <span class="sy1">=</span> <span class="nu0">41</span>, <span class="co1">// 更改 l.t 为 {42, 41, {18, 19} }</span>
|
|
.<span class="me1">t</span>.<span class="me1">a</span><span class="br0">[</span><span class="nu0">1</span><span class="br0">]</span> <span class="sy1">=</span> <span class="nu0">17</span> <span class="co1">// 更改 l.t 为 {42, 41, {18, 17} }</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">"l.t.k is %d<span class="es1">\n</span>"</span>, l.<span class="me1">t</span>.<span class="me1">k</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// .t = x 显式设置 l.t.k 为 42</span>
|
|
<span class="co1">// .t.l = 41 会隐式清零 l.t.k</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">l.t.k is 42</pre></div>
|
|
</div>
|
|
</div>
|
|
<p>然而,当初始化器以左开花括号开始时,会完全重初始化其<i>当前对象</i>,并忽略其任何子对象的先前的显式初始化器:</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="c source-c">
|
|
<pre class="de1"><span class="kw1">struct</span> fred <span class="br0">{</span> <span class="kw4">char</span> s<span class="br0">[</span><span class="nu0">4</span><span class="br0">]</span><span class="sy4">;</span> <span class="kw4">int</span> n<span class="sy4">;</span> <span class="br0">}</span><span class="sy4">;</span>
|
|
<span class="kw1">struct</span> fred x<span class="br0">[</span> <span class="br0">]</span> <span class="sy1">=</span> <span class="br0">{</span> <span class="br0">{</span> <span class="br0">{</span> <span class="st0">"abc"</span> <span class="br0">}</span>, <span class="nu0">1</span> <span class="br0">}</span>, <span class="co1">// 初始化 x[0] 为 { {'a','b','c','\0'}, 1 }</span>
|
|
<span class="br0">[</span><span class="nu0">0</span><span class="br0">]</span>.<span class="me1">s</span><span class="br0">[</span><span class="nu0">0</span><span class="br0">]</span> <span class="sy1">=</span> <span class="st0">'q'</span> <span class="co1">// 更改 x[0] 为 { {'q','b','c','\0'}, 1 }</span>
|
|
<span class="br0">}</span><span class="sy4">;</span>
|
|
<span class="kw1">struct</span> fred y<span class="br0">[</span> <span class="br0">]</span> <span class="sy1">=</span> <span class="br0">{</span> <span class="br0">{</span> <span class="br0">{</span> <span class="st0">"abc"</span> <span class="br0">}</span>, <span class="nu0">1</span> <span class="br0">}</span>, <span class="co1">// 初始化 y[0] 为 { {'a','b','c','\0'}, 1 }</span>
|
|
<span class="br0">[</span><span class="nu0">0</span><span class="br0">]</span> <span class="sy1">=</span> <span class="br0">{</span> <span class="co1">// 当前对象现在是整个 y[0] 对象</span>
|
|
.<span class="me1">s</span><span class="br0">[</span><span class="nu0">0</span><span class="br0">]</span> <span class="sy1">=</span> <span class="st0">'q'</span>
|
|
<span class="br0">}</span> <span class="co1">// 以 { {'q','\0','\0','\0'}, 0 } 替换 y[0]</span>
|
|
<span class="br0">}</span><span class="sy4">;</span></pre></div>
|
|
</div>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-c99">(C99 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
<h3><span class="mw-headline" id=".E6.B3.A8.E8.A7.A3">注解</span></h3>
|
|
<p>初始化器列表可拥有尾随的逗号,它被忽略。</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="c source-c">
|
|
<pre class="de1"><span class="kw1">struct</span> <span class="br0">{</span><span class="kw4">double</span> x,y<span class="sy4">;</span><span class="br0">}</span> p <span class="sy1">=</span> <span class="br0">{</span><span class="nu16">1.0</span>,
|
|
<span class="nu16">2.0</span>, <span class="co1">// 尾随逗号 OK</span>
|
|
<span class="br0">}</span><span class="sy4">;</span></pre></div>
|
|
</div>
|
|
<p>C 中,初始化器的花括号列表不能为空(注意 C++ 允许空列表,并且注意 C 中<a href="c-language-struct.html">结构体</a>不能为空):</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="c source-c">
|
|
<pre class="de1"><span class="kw1">struct</span> <span class="br0">{</span><span class="kw4">int</span> n<span class="sy4">;</span><span class="br0">}</span> s <span class="sy1">=</span> <span class="br0">{</span><span class="nu0">0</span><span class="br0">}</span><span class="sy4">;</span> <span class="co1">// OK</span>
|
|
<span class="kw1">struct</span> <span class="br0">{</span><span class="kw4">int</span> n<span class="sy4">;</span><span class="br0">}</span> s <span class="sy1">=</span> <span class="br0">{</span><span class="br0">}</span><span class="sy4">;</span> <span class="co1">// 错误:初始化器列表不能为空</span>
|
|
<span class="kw1">struct</span> <span class="br0">{</span><span class="br0">}</span> s <span class="sy1">=</span> <span class="br0">{</span><span class="br0">}</span><span class="sy4">;</span> <span class="co1">// 错误:结构体不能为空,初始化器列表不能为空</span></pre></div>
|
|
</div>
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-until-c99">
|
|
<td>
|
|
<p>在初始化任何存储期的聚合体时,初始化器列表中的每个表达式必须都是<a href="c-language-constant_expression.html">常量表达式</a>。</p>
|
|
</td>
|
|
<td><span class="t-mark-rev t-until-c99">(C99 前)</span></td>
|
|
</tr>
|
|
<tr class="t-rev t-since-c99">
|
|
<td>
|
|
<p>同所有其他初始化,在初始化静态或<span class="t-rev-inl t-since-c11"><span>线程局域</span> <span><span class="t-mark-rev t-since-c11">(C11 起)</span></span></span><a href="c-language-storage_duration.html">存储期</a>的聚合体时,初始化器列表中的每个表达式必须为<a href="c-language-constant_expression.html">常量表达式</a>:</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="c source-c">
|
|
<pre class="de1"><span class="kw4">static</span> <span class="kw1">struct</span> <span class="br0">{</span><span class="kw4">char</span><span class="sy2">*</span> p<span class="br0">}</span> s <span class="sy1">=</span> <span class="br0">{</span><a href="c-memory-malloc.html"><span class="kw403">malloc</span></a><span class="br0">(</span><span class="nu0">1</span><span class="br0">)</span><span class="br0">}</span><span class="sy4">;</span> <span class="co1">// 错误</span></pre></div>
|
|
</div>
|
|
<p>任何初始化器中的子表达式<a href="c-language-eval_order.html">求值顺序</a>为非确定顺序(但 C++11 起的 C++ 中不同):</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="c source-c">
|
|
<pre class="de1"><span class="kw4">int</span> n <span class="sy1">=</span> <span class="nu0">1</span><span class="sy4">;</span>
|
|
<span class="kw1">struct</span> <span class="br0">{</span><span class="kw4">int</span> x,y<span class="sy4">;</span><span class="br0">}</span> p <span class="sy1">=</span> <span class="br0">{</span>n<span class="sy2">++</span>, n<span class="sy2">++</span><span class="br0">}</span><span class="sy4">;</span> <span class="co1">// 未指定,但是良定义的行为:</span>
|
|
<span class="co1">// n 以任意顺序自增二次</span>
|
|
<span class="co1">// p 等于 {1,2} 和 {2,1} 都是合法的</span></pre></div>
|
|
</div>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-c99">(C99 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
<h3><span class="mw-headline" id=".E7.A4.BA.E4.BE.8B">示例</span></h3>
|
|
<table class="metadata plainlinks ambox mbox-small-left ambox-notice" style="">
|
|
<tr>
|
|
<td class="mbox-empty-cell"></td>
|
|
<td class="mbox-text" style="">本节未完成<br />
|
|
原因:更多实用的示例,最好初始化某些接头结构体</td>
|
|
</tr>
|
|
</table>
|
|
<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 <stdio.h></span>
|
|
<span class="co2">#include <time.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">char</span> buff<span class="br0">[</span><span class="nu0">70</span><span class="br0">]</span><span class="sy4">;</span>
|
|
<span class="co1">// 指派初始化器简化成员顺序未指定的结构体的使用</span>
|
|
<span class="kw1">struct</span> <a href="c-chrono-tm.html"><span class="kw523">tm</span></a> my_time <span class="sy1">=</span> <span class="br0">{</span> .<span class="me1">tm_year</span><span class="sy1">=</span><span class="nu0">2012</span><span class="sy2">-</span><span class="nu0">1900</span>, .<span class="me1">tm_mon</span><span class="sy1">=</span><span class="nu0">9</span>, .<span class="me1">tm_mday</span><span class="sy1">=</span><span class="nu0">9</span>,
|
|
.<span class="me1">tm_hour</span><span class="sy1">=</span><span class="nu0">8</span>, .<span class="me1">tm_min</span><span class="sy1">=</span><span class="nu0">10</span>, .<span class="me1">tm_sec</span><span class="sy1">=</span><span class="nu0">20</span> <span class="br0">}</span><span class="sy4">;</span>
|
|
<a href="c-chrono-strftime.html"><span class="kw517">strftime</span></a><span class="br0">(</span>buff, <span class="kw4">sizeof</span> buff, <span class="st0">"%A %c"</span>, <span class="sy3">&</span>my_time<span class="br0">)</span><span class="sy4">;</span>
|
|
<a href="c-io-puts.html"><span class="kw836">puts</span></a><span class="br0">(</span>buff<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">Sunday Sun Oct 9 08:10:20 2012</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.7.9/12-38 Initialization (p: 140-144)</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
<div class="t-ref-std-c99">
|
|
<ul>
|
|
<li>C99 标准(ISO/IEC 9899:1999):</li>
|
|
</ul>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>6.7.8/12-38 Initialization (p: 126-130)</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.5.7/9- Initialization</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>
|
|
</div>
|
|
<div class="visualClear"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|