函数双精度,整数如何工作?C++



你能解释一下这些函数是如何工作的吗?

double f(int i)
{
    cout<<"a";
    return 1;
}
int f(double i)
{
    cout<<"b";
    return 1;
}

为:

f(f(f(1)));

在我看来,结果应该是:aaa但它是aba

f(f(f(1.1)));的情况也是如此我认为应该有aab但有bab

从函数返回时,返回值的类型由函数原型确定,而不是按原样编写。如果类型不匹配,则会将其隐式转换为正确的类型。所以这个例子函数:

double foo(void) { return 1; }

实际上返回 double(1) 或等效地返回 1.0 。它返回int 1因为 int。但是,它会将您的int转换为double值,以匹配声明的函数的返回值类型。

所以来回答你的问题,最里面的函数叫double f(int),第二个叫的函数是int f(double),最外层叫的函数是double f(int)。这与你看到的输出相匹配:aba

f( f( f(1) ) );
↑  ↑  ↑
|  |  calls double f(int)
|  calls int f(double)
calls double f(int)
编译器

读取f(f(f(1)));函数的方式是从内到外。让我详细说明一下,编译器看到f(1);并查找一个名为 f 的函数,该函数将 int 作为参数,因此:

 double f(int i)
{
    cout<<"a";
    return 1;
}

现在,一旦你的函数执行,它就会返回一个双精度,因此第二个 f 会输入一个双精度 ->,它调用你的下一个函数,该函数需要双精度

int f(double i)
{
    cout<<"b";
    return 1;
}

按照上面解释的逻辑,我们已经到达了你的三重f问题的最后一层/外层。现在编译器有一个 int,并且正在寻找一个名为 f 的函数,该函数采用 int ->这是您声明的第一个函数。

这就是为什么你会因此得到 aba 的原因。

在代码中首次使用 std::cout 之前,添加以下行

std::cout << std::fixed;

这通过使 int 和 double 显示它们的"真实颜色"来改变(参数 i(的输出。 也许这将说明正在发生的事情。

例:

double f(int i)
   {
      std::cout << "  a" << std::setw(9) << i << "    " << std::flush;
      return 1;
   }
int f(double i)
   {
      std::cout << "  b" << std::setw(9) << i << "    " << std::flush;
      return 1;
   }
int main(int , char** )
{
   std::cout << std::fixed << "n";
   f(f(f(1)));
   std::cout << std::endl;
   f(f(f(1.0)));
   return 0;
}

生成输出:

 a        1      b 1.000000      a        1    
 b 1.000000      a        1      b 1.000000   
返回

值(始终为整数 1(隐式转换为返回类型,这两个函数的返回类型不同。

调用哪个函数由函数的签名决定,即参数的实际类型。 这也说明了返回类型不是签名的一部分。

最新更新