【问题标题】:Division between variable of different types | implicit type casting in C++不同类型变量之间的划分 | C++ 中的隐式类型转换
【发布时间】:2018-04-02 11:24:14
【问题描述】:

因为我是 C++ 的菜鸟,Udacity Quiz 叙述:

以下程序产生错误的输出。要修复程序,您需要更改至少两种变量类型:answer 和一个除数。

 #include <iostream>
 int main(void)
 {
     int numerator = 4; // no need to change type
     float denominator = 5.0; // changed to float
     float answer = 0.0; // changed to float

     answer = numerator / denominator;
     std::cout<<"answer = "<<answer; // answer = 0.8
     return 0;
 }

问题:这里的类型转换是如何暗示的以及为什么要在相等的两边改变变量类型。

为什么不只改变answer。按照指示,我尝试仅将float 设置为answerdenominator。现在它可以工作了,但我想学习 C++ 中的隐式类型转换。

PS:代码是 Udacity 课堂的测验

【问题讨论】:

  • 这里的正确答案是什么?这将输出answer = 0.8。不知道你想要什么,对我来说听起来不错..
  • 那么这里的问题是什么?为什么整数除法没有做他们想要发生的事情?想一想。
  • 你在引用什么?听起来像是一个比你在这里告诉读者更了解你努力实现的目标的人的推荐。
  • 显示的代码是应用推荐的结果还是需要更改?如果代码需要修复,现在可能已经坏了;请解释它是如何损坏的。
  • 问题很清楚,为什么我需要改变双方的变量类型,即答案变量和分子、分母变量。为什么不仅改变答案变量类型有效。

标签: c++ c++11 type-conversion typecasting-operator


【解决方案1】:

如果表达式的两个操作数

numerator / denominator

有整数类型,那么表达式的结果也有公共整数。

要获得浮点类型的结果,其中一个操作数必须是浮点类型。

另一方面,如果变量结果是整数类型,那么浮点类型表达式可能会被截断

numerator / denominator

【讨论】:

    【解决方案2】:

    除法发生在赋值之前。两个整数相除的结果是一个整数。这就是截断发生的地方,所以我们知道至少有一个操作数需要是浮点数才能保持精度。

    然后,如您所知,分配发生了。整数变量不能保持浮点结果的精度,所以也需要浮点数。

    这意味着如果除法的操作数不相同,则将提升一个以匹配另一个。喜欢

     int numerator = 4;
     float denominator = 5;
    

    关于划分:

    numerator / denominator;
    

    numerator 将被提升为浮动。正如answer中指出的那样@

    float / int =>  float / float = float
    int / int = int
    

    【讨论】:

    • 当其中一个操作数的精度低于您的示例时,会发生类型提升。 Here's a question 关于隐式类型提升。
    猜你喜欢
    • 2015-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多