【问题标题】:Unusual use of a Boolean expression布尔表达式的不寻常使用
【发布时间】:2014-02-24 06:18:25
【问题描述】:

这是我的代码库的一部分
代码:

bool succ = true;
//below is the place where warning is there 
succ &= draw( e0.x, e0.y, e0.z, (e0.x + dir.x), (e0.y + dir.y), (e0.z + dir.z));
//------
//------
bool draw( FLOAT x, FLOAT y, FLOAT z, FLOAT p, FLOAT q, FLOAT r)  
{
    bool ret;
    ret = fun(x,y,z,p,q,r);
    return ret;
}

警告:

Warning 514: Unusual use of a Boolean expression
Info 1786: Implicit conversion to Boolean (assignment) (int to bool)

我不想增加代码行,所以在一行中执行此逻辑...有人可以帮助我解决此问题...

【问题讨论】:

  • succ = succ && draw(...)?如果你有很多这样的调用,可能值得为它编写一个简单的实用函数
  • draw 正在返回 bool ....所以只需将结果与 succ 相加并将结果存储在 succ 中
  • @auselen 我猜他在同一个函数中有一堆绘图调用,并想检查是否全部成功
  • 当 draw() 是一个只做一行工作的三行函数并且可能根本不需要时,为什么要如此关注使 succ 分配保持在一行?跨度>
  • @Daniel 确实有很多draw call

标签: c++ lint


【解决方案1】:

你有一个 &= ,对于这些基本类型相当于

bool succ = ...;
succ = succ & draw(...);

但是按位 & 运算符采用整数值,因此需要将 succ 转换为 int 才能使用按位 & 进行比较。当你使用布尔值时,你应该使用

bool succ = ...;
succ = draw(...) && succ;

(正如所指出的,您必须在此处更改顺序,因为 && 是 c++ 实际上懒惰评估的极少数地方之一)

注意没有 &&= 运算符。

编辑:实际上 draw(...) 的结果也需要转换为 int ......

【讨论】:

  • 这改变了行为:第一个将无条件调用draw,而第二个只会在succ为真时调用它。
  • 我在进行相同的更改后得到以下警告分配给上下文中的强类型“bool”:分配
  • @mike:你是完全正确的。编辑使其正确。
【解决方案2】:

您可以获得等效的行为,而无需在布尔值和整数值之间进行任何可疑的转换

succ = draw(...) && succ;

if (!draw(...)) succ = false;

注意第一个操作数的顺序:succ && draw(...) 会改变行为,因此只有在succ 为真时才会调用draw

【讨论】:

    【解决方案3】:

    bool 没有等效紧凑的构造,因为没有 &&= 运算符。 &= 运算符强制与 int 进行转换。并且 && 强制进行短路评估。

    尝试以下方法之一:

    int succ; // define succ as integer to allow use of &=, just like in the good old days
    

    succ = draw( e0.x, e0.y, e0.z, (e0.x + dir.x), (e0.y + dir.y), (e0.z + dir.z)) && succ;
    

    succ = draw( e0.x, e0.y, e0.z, (e0.x + dir.x), (e0.y + dir.y), (e0.z + dir.z)) ? succ : false;
    

    if (!draw( e0.x, e0.y, e0.z, (e0.x + dir.x), (e0.y + dir.y), (e0.z + dir.z))) succ = false;
    

    【讨论】:

      猜你喜欢
      • 2010-09-21
      • 2023-03-15
      • 2014-04-21
      • 2012-05-08
      • 1970-01-01
      • 2012-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多