138 lines
7.7 KiB
HTML
138 lines
7.7 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_functions 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-identifier.html">标识符</a>(函数名)关联到一条<a href="c-language-statements.html#.E5.A4.8D.E5.90.88.E8.AF.AD.E5.8F.A5">复合语句</a>(函数体)的 C 语言构造。每个 C 程序都从 <a href="c-language-main_function.html"><code>main</code> 函数</a>开始执行,也从它或者调用其他用户定义函数或库函数终止。</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="c source-c">
|
|
<pre class="de1"><span class="co1">// 函数定义。</span>
|
|
<span class="co1">// 定义一个名为“ sum ”并拥有函数体“ { return x+y; } ”的函数</span>
|
|
<span class="kw4">int</span> sum<span class="br0">(</span><span class="kw4">int</span> x, <span class="kw4">int</span> y<span class="br0">)</span>
|
|
<span class="br0">{</span>
|
|
<span class="kw1">return</span> x <span class="sy2">+</span> y<span class="sy4">;</span>
|
|
<span class="br0">}</span></pre></div>
|
|
</div>
|
|
<p>函数可以拥有零或更多个<i>形参</i>,它们为<a href="c-language-operator_other.html#.E5.87.BD.E6.95.B0.E8.B0.83.E7.94.A8">函数调用运算符</a>的<i>实参</i>所初始化,并且以通过其 <a href="c-language-return.html"><code>return</code> 语句</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> n <span class="sy1">=</span> sum<span class="br0">(</span><span class="nu0">1</span>, <span class="nu0">2</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// 参数 x 和 y 为实参 1 和 2 所初始化</span></pre></div>
|
|
</div>
|
|
<p>函数体在<a href="c-language-function_definition.html">函数定义</a>中提供。每个被<a href="c-language-expressions.html#.E4.B8.8D.E6.B1.82.E5.80.BC.E8.A1.A8.E8.BE.BE.E5.BC.8F">实际调用</a>的函数必需且只需在程序中<a href="c-language-extern.html#.E4.B8.80.E4.B8.AA.E5.AE.9A.E4.B9.89.E8.A7.84.E5.88.99">定义一次</a><span class="t-rev-inl t-since-c99"><span>,除非该函数为 <a href="c-language-inline.html">inline</a></span> <span><span class="t-mark-rev t-since-c99">(C99 起)</span></span></span>。</p>
|
|
<p>不可以有嵌套函数(除了一些通过非标准的编译器扩展):每个函数定义必须出现在文件作用域,而且函数无法访问其来自其调用方的局部变量:</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="c source-c">
|
|
<pre class="de1"><span class="kw4">int</span> main<span class="br0">(</span><span class="kw4">void</span><span class="br0">)</span> <span class="co1">// main函数定义</span>
|
|
<span class="br0">{</span>
|
|
<span class="kw4">int</span> sum<span class="br0">(</span><span class="kw4">int</span>, <span class="kw4">int</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// 函数声明(可以出现于任何作用域)</span>
|
|
<span class="kw4">int</span> x <span class="sy1">=</span> <span class="nu0">1</span><span class="sy4">;</span> <span class="co1">// main 的局部变量</span>
|
|
sum<span class="br0">(</span><span class="nu0">1</span>, <span class="nu0">2</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// 函数调用</span>
|
|
|
|
<span class="co1">// int sum(int a, int b) // 错误:不允许嵌套函数</span>
|
|
<span class="co1">// {</span>
|
|
<span class="co1">// return a + b; </span>
|
|
<span class="co1">// }</span>
|
|
<span class="br0">}</span>
|
|
<span class="kw4">int</span> sum<span class="br0">(</span><span class="kw4">int</span> a, <span class="kw4">int</span> b<span class="br0">)</span> <span class="co1">// 函数定义</span>
|
|
<span class="br0">{</span>
|
|
<span class="co1">// return x + a + b; // 错误:不能在 sum 中访问 main 的 x</span>
|
|
<span class="kw1">return</span> a <span class="sy2">+</span> b<span class="sy4">;</span>
|
|
<span class="br0">}</span></pre></div>
|
|
</div>
|
|
<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.7.6.3 Function declarators (including prototypes) (p: 96-98)</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>6.9.1 Function definitions (p: 113-115)</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.7.6.3 Function declarators (including prototypes) (p: 133-136)</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>6.9.1 Function definitions (p: 156-158)</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.7.5.3 Function declarators (including prototypes) (p: 118-121)</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>6.9.1 Function definitions (p: 141-143)</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.5.4.3 Function declarators (including prototypes)</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>3.7.1 Function definitions</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>
|