在基于范围的循环范围内的双/整数使用和数据缩小
Double/Integer use and data narrowing within a Range-Based for loop
我正在通过Bjarne Stroustrup的编程原理和实践努力,并且遇到了困难。我目前正在向矢量阅读,并已被引入基于范围的循环。在下面,我有一些代码,从我的眼中看,似乎正在读一遍int to 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(循环的矢量,将第一个元素置于温度内,将其放在x中,而不是将其递增到下一个元素并重复。因为元素(双重(被读取为X(整数(,导致狭窄。
我的主要问题是,如果我确实确实正确,它正在缩小向量内的元素(也许它实际上没有读取x,而int x正在描述其他内容(,我可以简单地替换(int x:temps((for(double x:temps(避免这种缩小,或者是在基于范围的循环参数中使用整数的使用(也许是这样设计的(。任何想法,谢谢。
这是一个狭窄的转换,是的(第11.6.4节A.K.A. [dcl.init.list],c 标准,项目7.1(。我猜这是一个错误的类型。假装它说double x
(或auto x
,如果您已经知道auto
关键字,则可以使编译器推论类型(如果可能((。
我找不到第二版Errata。实际上,我实际上放弃了Stroustrup教授并问他(不要害羞 - 如您所见,这本书有很多错误,他应该对这个问题表示赞赏(。
- 是的,您可以使用任何类型来初始化您的
for
循环变量(其任何版本(。 - 是, c/c 中的浮点类型转换为整数类型,始终返回此数字的截断值(
floor
操作(。
请看一下C 铸造规则:
如果转换是从浮点类型到整数类型的,则该值被截断(去除小数部分(。如果结果不在类型的代表值范围之内,则转换会导致不确定的行为。
相关文章:
- 如何反转整数参数包
- enum是C++中的宏变量还是整数变量
- 努力将整数转换为链表。不知道我在这里做错了什么
- 整数不会重复超过随机数
- 在C++中手动调整数组大小
- 检查输入是否不是整数或数字
- C++使用整数的压缩数组初始化对象
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- 如何只允许用户输入正整数
- 如何在c++中从文本文件中逐行读取整数
- C++:如何循环通过向量中的整数元素
- 我可以信任表示整数的浮点或双精度来保持精度吗
- 序列化,没有库的整数,得到奇怪的结果
- 在一定长度后从数组中打印时缺少整数
- std::当在256字节边界上写入整数时,流的奇怪行为
- 内联程序集printf将整数解释为地址
- 在基于范围的循环范围内的双/整数使用和数据缩小