函数double如何工作? C ++

时间:2018-01-24 11:21:44

标签: c++ function

你能解释一下这些功能是如何运作的吗?

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

3 个答案:

答案 0 :(得分:15)

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

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)

答案 1 :(得分:5)

编译器读取 override func tableView(_ tableView: UITableView, willBeginEditingRowAt indexPath: IndexPath) { self.tableView.subviews.forEach { subview in print("YourTableViewController: \(String(describing: type(of: subview)))") if (String(describing: type(of: subview)) == "UISwipeActionPullView") { if (String(describing: type(of: subview.subviews[0])) == "UISwipeActionStandardButton") { var deleteBtnFrame = subview.subviews[0].frame deleteBtnFrame.origin.y = 12 deleteBtnFrame.size.height = 155 // Subview in this case is the whole edit View subview.frame.origin.y = subview.frame.origin.y + 12 subview.frame.size.height = 155 subview.subviews[0].frame = deleteBtnFrame subview.backgroundColor = UIColor.yellow } } } } 函数的方式是由内而外。让我详细说明,编译器看到f(f(f(1)));并且它查找一个名为 f 的函数,该函数将 int 作为参数,这样就可以了:

f(1);

现在,一旦你的函数执行,它会返回一个 double ,因此第二个 f 会引入一个double - &gt;它调用你的下一个需要双倍的函数

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

按照上面解释的逻辑,我们已经到达了你的三重问题的最后/外层。现在编译器有一个 int ,并且正在寻找一个名为f的函数,它接受int - &gt;这是你第一次申报的功能。

这就是为什么你得到aba的结果。

答案 2 :(得分:1)

在您的代码中首次使用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)被隐式转换为返回类型,这对于两个函数是不同的。

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