我正在维护一些代码并遇到了这个片段:
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
应始终完全相同,不是吗?
答案 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
评估为非零值以外的某个非零值,则此代码将无法正常工作。
进一步分析后,sum
和num
在循环结束时将具有相同的值。
因此,仅使用num
并在循环结束时转换为float
。
答案 2 :(得分:1)
如果value是bool
的(二维)数组,那么这与sum += 1
等效。与某些人的想法相反,与== true
的比较不与隐式转换为bool
相同(例如,在if语句的上下文中)条件)。任何不等于1
的整数都将被视为与true
不同。