跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
C 语言返回值
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
{{Note|本节内容适用于所有需要理解C语言函数返回值的初学者及进阶开发者}} = C语言返回值 = '''返回值'''是C语言函数向调用者传递数据的主要方式之一,它允许函数执行完毕后将结果反馈给调用方。理解返回值机制是掌握函数交互的核心基础。 == 基本概念 == === 定义 === 返回值是指函数通过<code>return</code>语句返回给调用者的数据,其类型必须与函数声明中的返回类型匹配。若函数声明为<code>void</code>,则不应返回任何值。 === 语法结构 === <pre> 返回类型 函数名(参数列表) { // 函数体 return 表达式; // 表达式类型需与返回类型兼容 } </pre> == 返回值类型 == C语言支持所有基本数据类型和自定义类型作为返回值: {| class="wikitable" |+ 常见返回值类型示例 ! 类型 !! 示例 !! 说明 |- | <code>int</code> || <code>return 42;</code> || 最常用的整数返回 |- | <code>float</code> || <code>return 3.14f;</code> || 单精度浮点数 |- | <code>double</code> || <code>return 2.71828;</code> || 双精度浮点数 |- | <code>char</code> || <code>return 'A';</code> || 单个字符 |- | <code>void*</code> || <code>return &data;</code> || 通用指针 |- | <code>struct</code> || <code>return point;</code> || 结构体(C99后支持直接返回) |} == 代码示例 == === 基础示例 === <syntaxhighlight lang="c"> #include <stdio.h> // 返回两个整数中较大的值 int max(int a, int b) { return (a > b) ? a : b; } int main() { int result = max(10, 20); printf("较大的值是: %d\n", result); // 输出: 较大的值是: 20 return 0; } </syntaxhighlight> === 多返回点示例 === <syntaxhighlight lang="c"> #include <stdbool.h> // 检查数字是否为质数 bool is_prime(int n) { if (n <= 1) return false; for (int i = 2; i*i <= n; i++) { if (n % i == 0) return false; // 发现因数立即返回 } return true; // 循环结束未发现因数 } </syntaxhighlight> == 返回值机制详解 == === 栈内存原理 === 当函数返回时,返回值通常通过以下方式传递: <mermaid> sequenceDiagram 调用者->>被调函数: 调用函数 被调函数->>CPU寄存器/栈: 存储返回值 被调函数-->>调用者: 返回控制权 调用者->>调用者: 从寄存器/栈读取返回值 </mermaid> === 返回值优化 === 现代编译器会对返回值进行优化(RVO/NRVO),避免不必要的拷贝: <syntaxhighlight lang="c"> struct BigData { int array[1000]; }; // 编译器可能优化为直接构造到调用者的内存空间 struct BigData create_big_data() { struct BigData bd; // 初始化操作... return bd; // 传统C需要拷贝,优化后可能避免 } </syntaxhighlight> == 高级主题 == === 错误处理模式 === C语言常用返回值表示操作状态: * 返回0表示成功 * 返回负数表示错误码 * 通过指针参数返回实际数据 <syntaxhighlight lang="c"> // 标准库风格错误处理 int parse_input(const char* input, int* output) { char* end; long val = strtol(input, &end, 10); if (end == input) return -1; // 转换失败 if (val < INT_MIN || val > INT_MAX) return -2; // 溢出 *output = (int)val; return 0; // 成功 } </syntaxhighlight> === 多值返回技巧 === 虽然C不支持直接返回多个值,但可通过以下方式实现: * 结构体打包 * 指针参数 * 全局变量(不推荐) <syntaxhighlight lang="c"> // 使用结构体返回多个值 typedef struct { int quotient; int remainder; } DivResult; DivResult divide(int a, int b) { return (DivResult){a / b, a % b}; } </syntaxhighlight> == 常见问题 == {{Warning|1=以下情况会导致未定义行为:}} * 非void函数缺少return语句 * void函数尝试返回值 * 返回局部变量的地址 === 数学表达 === 函数返回值可以看作数学映射: <math> f : X \rightarrow Y </math> 其中<math>X</math>是参数类型,<math>Y</math>是返回类型。 == 最佳实践 == # 保持返回值类型简单明确 # 错误处理返回值应文档化 # 避免返回动态分配内存的指针(除非明确所有权) # 对复杂数据类型优先返回结构体指针(C99前) {{Exercise|尝试编写一个函数,计算斐波那契数列第n项并返回结果,注意处理边界条件。}} == 总结 == 返回值是C语言函数与外界通信的关键通道。正确使用返回值需要: * 理解类型系统的要求 * 掌握内存管理的影响 * 遵循一致的错误处理规范 * 利用现代编译器的优化能力 通过合理设计返回值,可以构建出既安全又高效的函数接口。 [[Category:编程语言]] [[Category:C]] [[Category:C 语言函数]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)
该页面使用的模板:
模板:Exercise
(
编辑
)
模板:Mbox
(
编辑
)
模板:Note
(
编辑
)
模板:Warning
(
编辑
)
模块:Arguments
(
编辑
)
模块:Message box
(
编辑
)
模块:Message box/ambox.css
(
编辑
)
模块:Message box/configuration
(
编辑
)
模块:Yesno
(
编辑
)