参数n的函数返回是什么?请帮我理解?
unsigned int f(unisigned int n) // function declaration
{
// wht f function return in term of argument n?
}
答案 0 :(得分:2)
如果调用代码试图访问返回值,那么它将是未定义的行为:
但是,如果从未使用过返回值,那么它定义明确,没有什么特别的事情发生。编译器不需要发出警告。
int main()
{
foo(6); // OK
unsigned int foo = f(5); // UB
}
当然,故意编写这样的代码是一个糟糕的主意。
答案 1 :(得分:0)
虽然此问题与Why does this C++ snippet compile (non-void function does not return a value)不完全相同,但它包含了answer Shafik Yaghmour的优秀问题:
这是undefined behavior C++11 draft standard 部分
6.6.3
返回声明段 2 ,其中说:[...]离开函数末尾相当于没有值的返回;这会导致值返回时出现未定义的行为 功能。 [...]
这意味着编译器没有义务提供错误也没有 警告通常是因为在所有情况下都很难诊断。 我们可以从 undefined behavior 的定义中看出这一点
1.3.24
部分中的标准草案,其中说:[...]允许的未定义行为范围从完全忽略不可预测的结果,到行为期间的行为 以文件化的方式执行翻译或程序执行 环境(有或没有发布诊断 消息),终止翻译或执行(与发行 诊断信息)。[...]
虽然在这种情况下我们可以同时获得
gcc
和clang
来生成 使用-Wall
标志警告,这给我一个类似的警告 这样:警告:控制到达非空函数的末尾[-Wreturn-type]
理论上,任何都可能来自未定义的行为。实际上,你可能会得到一个垃圾结果。