我正在通过Bjarne Stroustrup的编程原则和实践,并且遇到了困难。我目前正在阅读Vector,并已介绍到基于范围的for循环。下面我有一些代码,从我的眼睛看,似乎正在阅读一个双重进入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正在描述其他内容),我可以简单地替换为(int x :temps)to for(double x:temps)以避免这种缩小,或者是在基于范围的for循环参数中强制使用整数(可能是这样设计的)。有任何想法,谢谢。
答案 0 :(得分:2)
这是一个缩小的转换,是的(the C++ standard的第11.6.4节a.k.a. [dcl.init.list],第7.1项)。我猜它是一种错误的类型。如果您已经知道double x
关键字,假设它说auto x
(或auto
,这会使编译器在可能的情况下推断出类型。)
我无法在2nd edition errata找到这个。我实际上让Stroustrup教授放弃了一条线并问他(不要害羞 - 正如你所看到的,这本书有很多错误,他应该感谢这个问题。)
答案 1 :(得分:0)
for
循环变量(任何版本的变量)。floor
操作)。请在C ++投射规则中采用look:
如果转换是从浮点类型转换为整数类型,则会截断该值(删除小数部分)。如果结果位于类型的可表示值范围之外,则转换会导致未定义的行为。