不同情况下的不同行为"警告C4800:' int' :强迫价值飙升' true'或者' false'"

时间:2015-10-27 06:37:56

标签: c++ visual-studio-2013

我无法理解此警告的以下行为。

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
  if (e.Row.RowType == DataControlRowType.DataRow)
  {
    if(e.Row.Cells[0].Text.Contains("0:00:00"))
       e.Row.Cells[0].Text = e.Row.Cells[0].Text.Replace("0:00:00", "");
  }
}

为什么编译器在案例2中生成警告,而在案例1中没有发出任何警告。

3 个答案:

答案 0 :(得分:3)

C4800是性能警告 - 在运行时将整数强制转换为bool会产生成本。
它与逻辑正确无关。

最常见的coersion(和警告)是当您使用整数(VC ++中为BOOL)的代码与布尔值接口时。

第一个代码段中的编译时强制不会导致运行时开销,因此没有警告。

要摆脱警告,摆脱强制:

bool read = (b & 3) != 0;

答案 1 :(得分:1)

关于你提到的两种情况,它们的不同之处在于,在一种情况下,整数值是编译时常数(或者至少它可以很容易地减少到1)。也许假设用常量表达式初始化不应该触发这个警告?我会检查供应商的错误跟踪系统以获取更多信息。

然而,实际上我忽略甚至禁用此警告。考虑测试单个位的情况:bool negative = byte & 0x80;。这段代码就是我所谓的惯用代码,它会生成一个警告。对我来说,这就是为什么这个警告不好的证明。

答案 2 :(得分:1)

在第一种情况下,您可以从表达式创建布尔变量。有可能

std::cout << std::is_constructible<decltype((33 & 3)), bool>::value<<std::endl; // output: 1

在第二种情况下,您从表达式构造int变量。此表达式int

的类型
std::cout << typeid(b & 3).name() << std::endl; // output: i

最后,您使用从int到bool的隐式类型转换并获得警告。