【问题标题】:Why does the C++ function without a return statement return a value? [duplicate]为什么没有return语句的C++函数会返回一个值? [复制]
【发布时间】:2020-06-15 16:12:22
【问题描述】:

我用C++实现了定点迭代,忘记了return语句:

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
}

然后我调用了函数:

/* 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;
}

我得到了以下结果:

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。 (我也检查过Function not returning value, but cout displays it,但它不适用于我。)

【问题讨论】:

    标签: c++ return


    【解决方案1】:

    为什么 C++ 函数...返回一个值?

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

    ...没有返回语句...

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

    为什么返回那个值?

    因为程序的行为是未定义的。

    【讨论】:

      【解决方案2】:

      不从非 void 函数返回的是undefined behavior。这意味着任何事情都可能发生。其中之一是实际上返回一个值。

      但是,这不是您可以依赖的行为。程序崩溃、打印垃圾等都是有效的行为。打开编译器警告,它们会告诉你你犯了一个错误。

      【讨论】:

        【解决方案3】:

        您通过声明double fixedpoint(...) 将函数定义为返回一些东西,因此它会返回一些东西。从调用函数的角度考虑:它只知道你的函数的签名,并期望找到一个双精度值作为返回值。它不知道您的实现,即您没有指定返回值这一事实。

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

        【讨论】:

          猜你喜欢
          • 2011-04-13
          • 1970-01-01
          • 2013-02-27
          • 2018-11-20
          • 2016-06-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-03-14
          相关资源
          最近更新 更多