代码之家  ›  专栏  ›  技术社区  ›  Kainaan Riordan

在基于for循环的范围内使用双精度/整数并缩小数据范围

  •  4
  • Kainaan Riordan  · 技术社区  · 7 年前

    我正在努力学习比亚恩·斯特劳斯塔普的编程原则和实践,遇到了一些困难。我目前正在阅读向量,并已被介绍到基于范围的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)循环中创建了一个double和than的向量,将temp中的第一个元素放入x中,然后处理它,然后递增到下一个元素并重复。因为元素(一个双精度)被读入x(一个整数)中,导致了变窄。

    我的主要问题是,如果我确实是正确的,那就是缩小向量中的元素(可能它实际上没有读入x,而int x正在描述其他东西),我可以简单地将for(int x:temps)替换为for(double x:temps)以避免这种缩小,还是必须在基于范围的for循环参数中使用整数(可能是这样设计的)。有什么想法吗,谢谢。

    2 回复  |  直到 7 年前
        1
  •  2
  •   einpoklum    7 年前

    这是一个缩小的转换,是的(第11.6.4节a.k.a.【dcl初始列表】 the C++ standard ,第7.1项)。我猜这是一个错误的类型。假装它说 double x (或 auto x 如果您已经知道 auto 关键字,使编译器尽可能推断类型)。

    我在 2nd edition errata 虽然实际上,我会给斯特劳斯特鲁普教授写封信,问他(不要害羞——正如你所看到的,这本书有很多错误,他应该很感激这个问题)。

        2
  •  0
  •   marcos assis    7 年前
    1. 是的,您可以使用 任何类型 初始化 for 循环变量(它的任何版本)。
    2. 从浮点类型到整数类型的任何转换 在C/C++中,始终返回此数字的截断值( floor 操作)。

    请拿一个 look at C++强制转换规则:

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