添加`bool`到`float`

wol*_*k88 2 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;
Run Code Online (Sandbox Code Playgroud)

编写这段代码的人最初在这里做了一些非常聪明的事情,或者应该ans永远是1?据我所知,num并且sum应该始终是完全相同的值,不是吗?

Sha*_*our 5

这与将转换为值相同,sum += 1因为C++标准部分中的浮动积分转换涵盖了以下内容:true14.9

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

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

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

我们知道,E1 += E2相当于E1 = E1 + E2从段5.17 分配和复合赋值运算符它说:

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