将bool添加到float中
Adding `bool` to `float`
我正在维护一些代码,并遇到了这个代码片段:
int num = 0;
float sum = 0.0;
bool value[rows][cols]; //initialized elsewhere in the code
for(int i = 0; i < rows; i++)
for(int j = 0; j < cols; j++)
if(value[i][j] == true) {
sum += value[i][j]; //shouldn't this be equivalent to "sum += 1;"
//as it is in the if block?
num++;
}
float ans = 1.0;
if(num > 12)
ans = sum / num;
是写这段代码的人在这里做了一些非常聪明的事情,还是ans
应该一直是1
?据我所知,num
和sum
应该总是完全相同的值,不是吗?
这将与sum += 1
相同,因为true
的值将被转换为1
,这在c++标准草案4.9
浮点整数转换中有涉及,其中说:
如果源类型为bool,则值为False被转换为0,true被转换为1。
加性操作符将导致在其操作数上执行常规算术转换。在这种情况下,将由以下情况涵盖:
否则,如果其中一个操作数为浮点数,则另一个操作数转换为浮点数。
我们知道E1 += E2
相当于E1 = E1 + E2
,从5.17
赋值和复合赋值操作符中可以看出:
E1 op = E2形式表达式的行为等价于E1 = E1 op E2,只是E1是只求值一次[…]
答案并不非常聪明,因为if
语句仍然存在。
聪明的人会这样做:
for(int i = 0; i < rows; i++)
{
for(int j = 0; j < cols; j++)
{
sum += value[i][j]; // Add 1 if true, 0 if false.
num += value[i][j]; // Add 1 (increment) if true, add 0 if false
}
}
假设bool
类型如果是true
将转换为1,如果是false
将转换为0。这就是计算机诞生之初人们做事的方式。
如果true
的计算结果不是1,则此代码将不能正常工作。
进一步分析,sum
和num
在循环结束时具有相同的值。因此,只使用num
并在循环结束时转换为float
。
如果value是bool
的(二维)数组,那么这与sum += 1
等价。与一些人的想法相反,与== true
的比较是而不是,与隐式转换到bool
相同(例如在if语句的条件上下文中)。任何不等于1
的整数将被认为与true
不同。
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 如何在C++中从两个单独的for循环中添加两个数组
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- 如何仅为一个函数添加延迟
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 使用std::transform将一个范围的元素添加到另一个范围中
- 如何将更多文件夹添加到c++include路径
- 如何将元素添加到数组的线程安全函数?
- QT通过C++添加映射QML项目
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- 如何使用重载的相等(==)运算符向测试用例添加描述
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 只能向C++添加一定数量的字符
- Qt和C++:将QLineEdit添加到QTabWidget中
- 将QIcon添加到QTableView单元格
- 为什么我必须在C++中添加一个赋值符号来声明一个数组
- 为什么除非添加括号,否则构造函数上的模板替换会失败?
- 为什么将 1 添加到 numeric_limits<float>::min() 返回 1?
- 将bool添加到float中