【问题标题】:Double/Integer use and data narrowing within a Range-Based for loop在基于范围的 for 循环中使用双精度/整数和数据缩小范围
【发布时间】:2018-09-11 05:33:37
【问题描述】:

我正在学习 Bjarne Stroustrup 的编程原理和实践,但遇到了困难。我目前正在阅读 Vectors 并已被介绍到基于 Range 的 for 循环。下面我有一些代码,从我的角度来看,它似乎是在将一个 double 读入一个 INT;我认为这会导致收窄。

int main()
{
    vector<double> temps;               // temperatures
    for (double temp; cin >> temp; )    // read into temp
        temps.push_back(temp);          // put temp into vector
                                        // compute mean temperature:
    double sum = 0;
    for (int x : temps) sum += x;
        cout << "Average temperature: " << sum / temps.size() << '\n'; 
                                        // compute median temperature:
    sort(temps);                        // sort temperatures
    cout << "Median temperature: " << temps[temps.size() / 2] << '\n';
    keep_window_open();
    return 0;
}

在尝试使用不同的输入数次后,我得出结论,这确实在缩小。我正在创建一个双精度向量,而不是在 for(int x : temps) 循环中,将第一个元素放入 temp 中,将其放入 x 中,处理它而不是递增到下一个元素并重复。因为元素(双精度)被读入 x(整数)导致缩小。

我的主要问题是,如果我确实是正确的,它正在缩小向量中的元素(也许它实际上并没有读入 x 并且 int x 正在描述其他内容),我可以简单地替换 for(int x : temps ) 到 for(double x : temps) 以避免这种缩小,或者在基于范围的 for 循环参数中使用整数是强制性的(可能是这样设计的)。任何想法,谢谢。

【问题讨论】:

  • 我想知道这不是错字。
  • 我同意,一定是错字。搜索书名和errata,然后选择与您的版本相匹配的结果。

标签: c++ c++11 c++14


【解决方案1】:

这是一个缩小转换,是的(the C++ standard 的第 11.6.4 节又名 [dcl.init.list],第 7.1 项)。我猜这是一个错误的类型。假装它说double x(或者auto x,如果你已经知道auto关键字,它会让编译器尽可能推断出类型)。

我在2nd edition errata 中找不到这个。实际上,我会写信给 Stroustrup 教授并问他(不要害羞 - 正如你所看到的,这本书有很多错误,他应该感谢这个问题)。

【讨论】:

  • 完美!非常感谢您的及时回复。我不知道这本书有勘误表。我以后会参考这个,如果没有,我会尝试联系他。
【解决方案2】:
  1. 是的,您可以使用任何类型来初始化您的for 循环变量(它的任何版本)。
  2. 是的,在 C/C++ 中从浮点类型到整数类型的任何转换,总是返回此数字的截断值(floor 操作)。

请在 C++ 强制转换规则中使用look

如果从浮点类型转换为整数类型,则值被截断(小数部分被删除)。如果结果超出该类型的可表示值范围,则转换会导致未定义的行为。

【讨论】:

    猜你喜欢
    • 2016-10-31
    • 1970-01-01
    • 1970-01-01
    • 2021-05-02
    • 2013-01-04
    • 1970-01-01
    • 2017-03-20
    • 2016-04-03
    • 2014-12-06
    相关资源
    最近更新 更多