阅读有关该主题的答案后控制到达非 void 函数的末尾我没有看到任何专门针对以空退出非 void 函数的情况的答案return
陈述:
int return_integer() { return; } // empty return in non-void function
到目前为止我发现了什么C标准 is:
6.8.6.4 返回语句
约束条件
- A
return
带有表达式的语句不得出现在返回类型为void
. A return
不带表达式的语句只能出现在返回类型为void
.
标准报价说明了什么should我们用我们的return
的陈述void
和非void
函数,当我们忽略约束时会发生什么,文档的其他部分提到了:
6.9.1 函数定义
- If the
}
到达终止函数,并且函数调用的值由调用者使用,行为是未定义的。
之前的标准引用指出,如果我们使用函数的返回值,该函数在到达右花括号后结束,就会发生 UB (}
),所以我们在下面的代码中有UB:
int UB(int x) { if (x) return x; }
printf("%d", UB(1)); // Correct
printf("%d", UB(0)); // Undefined behavior
In the UB(1)
调用函数返回1
通过return x;
根据指示if (x)
;在里面UB(0)
打电话给if (x)
条件未通过,因此函数结束到达}
,在这种情况下使用返回值是 UB (但不在UB(1)
)。但是,在这种情况下会发生什么呢?
int UB(int x) { if (x) return; } // empty return statement
printf("%d", UB(1)); // Undefined behavior?
printf("%d", UB(0)); // Undefined behavior
在上面的代码中,调用了UB(1)
不满足§6.9.1/12
因为函数结束而导致 UB 的要求没有达到}
并且也不返回任何值。
C 标准的哪一部分描述了这种情况?
int UB(int x) { if (x) return; }
这甚至不是未定义的行为,它是违反约束。引用的文本
不带表达式的 return 语句只能出现在
返回类型为 void 的函数
6.8.6.4 中的内容是规范性的,这意味着编译器不允许在不给出诊断消息的情况下让它溜走。如果编译时没有给出诊断,则编译器不是合格的实现(不遵循语言标准)。
用简单的英语来说,这意味着:该代码甚至不应该编译。
现在,如果编译器确实生成了二进制可执行文件,即使代码违反了约束,那么所有的赌注都将落空。它不再是一个 C 程序,而是某种非标准程序,任何语言标准都无法保证其行为。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)