【问题标题】:Automatic conversions and promotions in function calls in C++C++ 函数调用中的自动转换和提升
【发布时间】:2019-12-30 16:36:28
【问题描述】:

如何了解函数调用中的转化促销

在我之前的question 中,关于为什么调用一些函数,尽管其他函数也可能被调用,我想强调三个关键字:conversions促销完美匹配

  • 完美匹配是最简单的:

    • int fun(int a) 使用声明为 int x; 的变量调用
    • int fun(float a, double b) 使用声明的变量调用 float x; double y;
    • int fun(char a, string s) 使用声明的变量调用 char x; string y
    • ...等
  • 对于转化促销,我只想提一下:

Numeric conversions与促销不同,数字转换可能会更改值,并可能会损失精度。

Numeric promotions:从较小的类型转换为较大的相同类型(例如 char 到 int),但不会丢失任何内容

这里是不那么简单的部分。 我希望有人解释一下您在分析函数参数时需要思考的方式,以应对不同的调用情况:

  • int fun(double a)float x 对比 int fun (float a)double x 调用

我想实际看一些例子,因为对于初学者来说,cpp 的引用并不容易理解。

【问题讨论】:

  • 我希望看到一些示例,例如 function prototypevariables 以及函数被调用。然后简要解释一下您的看法(例如,这里是转换,因为 X 和 Y,还有促销,因为那是 W 和 Z)

标签: c++ type-conversion integer-promotion


【解决方案1】:

拥有:

int fun(double a)

使用float x 调用会使其成为浮点提升,这是因为double 将始终与float 相同或更大,这意味着我们的参数a 将始终能够保存我们通过float 传递给它的数据,不会发生数据丢失,因此这是一种促销。


但是,有:

int fun(float a)

使用double x 调用会使其成为可能发生数据丢失或可能出现UB 的浮点转换。正是因为这种情况与上面的情况相反,我们的double 可能持有一个在float 中无法表示的值,这反过来又可能导致 UB。有关具体规则,请参阅Floating-point conversions

【讨论】:

  • @FrançoisAndrieux 我认为 OP 只想要一个例子,因为问题似乎已经表明 OP 知道什么是促销与转换。转换可能是有损的,而促销永远不会有损。但也许我理解错了。
  • 我猜你是对的,它没有被要求,但是在我自己尝试回答这个问题时,我发现definition 用于浮点提升不符合普遍的理解它与类型精度或宽度有关。从另一个浮点类型转换为 long double 似乎永远没有资格被视为晋升。
  • 您能否解释一下,例如,如果有一个重载函数并使用一些参数调用它,那么可能会选择一个提升或一个转换?在函数调用中是否有可能是转换后跟提升或反之亦然(对于相同的参数)?
  • @CătălinaSîrbu 不确定我是否理解,您能详细说明一下吗?也可以使用聊天室。
  • @CătălinaSîrbu chat.stackoverflow.com/rooms/205462/cpp-talk 了解更多信息。
猜你喜欢
  • 1970-01-01
  • 2017-02-16
  • 2017-09-11
  • 2011-12-28
  • 2010-11-18
  • 1970-01-01
  • 2012-11-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多