函数能否返回非显式返回值?给定C函数的x是否必然为三者之一?
问题1:一个函数是否有可能返回与其显式返回值不同的值?
- 是的,存在多种场景会导致这种情况:
- 未定义行为场景:非
void类型的函数未通过return语句返回值就结束执行,此时函数返回值是未定义的,可能是任意随机值。 - 非法内存操作:通过指针等方式非法修改栈上存储返回值的区域,会篡改函数的返回结果,这属于严重的未定义行为。
- 并发逻辑错误:如果函数返回的是未加同步保护的共享变量,其他线程异步修改该变量时,可能导致返回值与显式
return的内容不一致。
- 未定义行为场景:非
问题2:给定如下C代码,变量x是否必然始终为1、2、3这三个可能值之一?
int my_func(void) { if(/*condition*/) { return 1; } else if (/*other condition*/) { return 2; } return 3; } int x = my_func();
- 结论:变量x必然是1、2、3三者之一。
- 依据C17标准§6.9.1/12的规定:
对于返回类型非
void的函数,其所有执行路径都必须通过return语句指定返回值;若违反此规则,调用函数的行为属于未定义行为。 - 本代码中
my_func的所有执行分支都有明确的return语句:- 第一个
if条件成立时返回1; - 第一个
if不成立但第二个else if成立时返回2; - 前两个条件均不成立时,执行最后的
return 3。
- 第一个
- 从编译实现层面(以GCC为例):x86架构下,函数返回值会存入
eax/rax寄存器,每个return语句都会将对应数值写入该寄存器,调用方读取寄存器值赋值给x,因此只会得到1、2、3中的一个值。
内容的提问来源于stack exchange,提问作者sneaker
相关产品推荐
相关产品推荐

