警告“C4800:'int':强制值为bool'true'或false'”,为什么?

时间:2014-06-11 16:55:41

标签: c++

// Implementation of the INTTerface for cblas_saxpy
template <> inline void cblas_axpy<bool>( INTT n,  bool a,  bool* X,
       INTT incX, bool* Y,  INTT incY) {
   for (int i = 0; i<n; ++i)
      Y[i] = a*X[i];
};
  

warning C4800: 'int' : forcing value to bool 'true' or 'false' (performance warning)

这是使警告发生的代码的一部分。我不知道如何解决它。请 有人给我一些建议。非常感谢你!

3 个答案:

答案 0 :(得分:2)

解决方案

对于两个 bool 类型的操作数使用乘法是明确定义的,但它通常不赞成,因为它从理论上看是没有意义的。不要将两个操作数相乘,而是使用按位 - 和逻辑 - 和,如下例所示:

bool a = true;
bool b = true;

bool c = a && b;  // c = true  (using logical-and, RECOMMENDED)
bool d = a & !b;  // d = false (using bitwise-and)

Y[i] = a && X[i]; // fix

警告怎么办?

发出的警告完全没用,因为乘法中涉及的两个操作数都是 bool 类型通常的算术转换规则声明结果也是类型< EM> BOOL 。

可能会引入警告以保护在计算两个操作数的乘法时发生隐式转换为 bool 的情况,其中结果类型为 < EM> BOOL

您正在使用的编译器不准确,假设两个算术值相乘可能会导致目标类型无法表示的值(如果是 bool ),并决定发出诊断。< / p>


在下面的示例中,x * y的结果产量将遵循通常的算术转换的规则int,这意味着表达式的结果将存储在 int ,然后截断以适合 bool

int  x = 10;
bool y = false;

bool z = x * y; // (1), semantically equivalent of `bool x = (int)(x * (int)y)`

标准参考(n3337

  

5.6p2 乘法运算符 [expr.mul]

     
    

*/的操作数应具有算术或未计算的枚举类型; %的操作数应具有整数或无范围的枚举类型。通常的算术转换是在操作数上执行的,并确定结果的类型。

  

  

5p9 表达式 [expr]

     
    

许多期望算术或枚举类型操作数的二元运算符会以类似的方式导致转换并产生结果类型。目的是产生一个通用类型,它也是结果的类型。该模式称为通常的算术转换,其定义如下:

         
        
  • ...

             
          
    • 如果两个操作数的类型相同,则无需进一步转换。
    •     
    • ...
    •     
  •     
  

答案 1 :(得分:1)

为什么不用以下代替:

 template <> inline void cblas_axpy<bool>( INTT n,  bool a,  bool* X,
   INTT incX, bool* Y,  INTT incY) {
  for (int i = 0; i<n; ++i)
  Y[i] = a && X[i];
 };

我认为编译器是抱怨的,因为乘以两个bool需要将结果从int转换为bool,并且成本更高,只需乘以两个整数。每次将int转换为bool时都会发生此警告。如果Y为int,则不会引发警告。

答案 2 :(得分:0)

这是一个无意义的转向另一个有意义的废话......

就c ++规范而言,这种解释可能并不严谨,但它可能有助于理解正在发生的事情。

bool二进制操作只是&&||

但是bool隐式转换为int,假设为false = 1且真实= 1。

由于*是一个int乘法,因此bool * bool --> nonsense变为int * int --> int。 (这实际上是有道理的,但可能不是你的意思)

现在你有了一个你分配给bool的乘法返回的int和一个16位或32位签名者范围的东西(需要被截断为一位)

警告是关于这种截断。


注意:根据C ++规范,定义了bool * bool,但思考我建议的方式可以在抽象推理中提供更多帮助,其中泛型类型之间的转换发生或转换为不同类型的积分(或隐式转换为这样可以在附近。