首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么没有返回语句的C++函数返回一个值?

为什么没有返回语句的C++函数返回一个值?
EN

Stack Overflow用户
提问于 2020-06-15 16:12:22
回答 3查看 617关注 0票数 0

我在C++中实现了定点迭代,忘记了返回语句:

代码语言:javascript
复制
double fixedpoint(double g(double), double p0, double tol, double max_iter)
{
  double p, error, i = 1;

  do
  {
    p = g(p0);

    error = std::abs(p - p0);
    i++;

    p0 = p;
  } while (i < max_iter && error > tol);

  // No return statement
}

然后我调用了这个函数:

代码语言:javascript
复制
/* g(x) = (3x^2 + 3)^(1/4) */
double g(double x)
{
  return pow(3 * x * x + 3, 0.25);
}

int main()
{
  // Test
  double p0 = 1;
  double tol = 1e-2;
  int max_iter = 20;

  double p = fixedpoint(g, p0, tol, max_iter);

  cout << "Solve x = (3x^2 + 3)^(1/4) correct to within 1e-2 using fixed-point iteration:" << endl;
  cout << "Solution: x = " << setiosflags(ios::fixed) << setprecision(6) << p << endl;
}

我得到了以下结果:

代码语言:javascript
复制
Solve x = (3x^2 + 3)^(1/4) correct to within 1e-2 using fixed-point iteration:
Solution: x = 0.005809

实际上,0.005809是error变量(在fixedpoint函数中)在最后一次迭代时的值。为什么会返回这个值?

我用的是GCC 7.4.0版。(我也查过函数不返回值,但cout显示它。,但它不适用于我。)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-06-15 16:14:04

不从非空函数返回是未定义行为。这意味着任何事情都可能发生。其中之一就是返回一个值。

但是,这不是您可以依赖的行为。破坏程序、打印垃圾等等都是有效的行为。打开编译器警告,它们会告诉您您正在犯错误。

票数 3
EN

Stack Overflow用户

发布于 2020-06-15 16:17:34

为什么C++函数..。还值?

您声明该函数返回一个值。因此,函数返回一个值。

..。没有回复声明..。

您未能编写返回语句。程序的行为是没有定义的。

为什么会返回这个值?

因为程序的行为是没有定义的。

票数 4
EN

Stack Overflow用户

发布于 2020-06-15 16:14:17

您通过声明函数double fixedpoint(...)将函数定义为返回某物,因此它将返回某些内容。从调用函数的角度考虑它:它只知道函数的签名,并期望找到一个双值作为返回值。它不知道您的实现,也就是说,您没有指定返回值。

现在,如果您不指定返回值,则返回字段通常是未初始化的,并且包含随机数据,但是行为是未定义的,这意味着原则上任何事情都可能发生。打开编译器警告(强烈建议),将警告您这一点。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62392414

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档