将bool添加到float中

Adding `bool` to `float`

本文关键字:float 添加 bool      更新时间:2023-10-16

我正在维护一些代码,并遇到了这个代码片段:

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 ?据我所知,numsum应该总是完全相同的值,不是吗?

这将与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,则此代码将不能正常工作。

进一步分析,sumnum在循环结束时具有相同的值。因此,只使用num并在循环结束时转换为float

如果value是bool的(二维)数组,那么这与sum += 1等价。与一些人的想法相反,与== true的比较是而不是,与隐式转换到bool相同(例如在if语句的条件上下文中)。任何不等于1的整数将被认为与true不同。