添加`bool`到`float`

时间:2014-07-29 18:54:34

标签: c++ implicit-conversion

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

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应始终完全相同,不是吗?

3 个答案:

答案 0 :(得分:5)

这与sum += 1相同,因为true值将转换为1 draft C++ standard部分4.9 浮动 - 整合转化,其中说:

  

如果源类型是bool,则为值   false转换为零,值true转换为一。

加法运算符将导致通常的算术转换在其操作数上执行。在这种情况下,本案将涵盖哪些内容:

  

否则,如果任一操作数是浮点数,则另一个操作数应转换为浮点数。

我们知道E1 += E2相当于E1 = E1 + E2 分配和复合赋值运算符中的5.17,其中包含:

  

E1 op = E2形式的表达式的行为等同于E1 = E1 op E2,除了E1是   只评估过一次。[...]

答案 1 :(得分:3)

答案不是 fiendlishly 聪明,因为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评估为非零值以外的某个非零值,则此代码将无法正常工作。

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

答案 2 :(得分:1)

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