C ++“OR”运算符

时间:2011-02-20 17:25:46

标签: c++ programming-languages codeblocks

这可以以某种方式完成吗?

if((a || b) == 0) return 1;
return 0;

所以就像...如果一个OR b等于零,那么...但它对我不起作用。 我的真实代码是:

bool Circle2::contains(Line2 l) {
    if((p1.distanceFrom(l.p1) || p1.distanceFrom(l.p2)) <= r) {
        return 1;
    }
    return 0;
}

9 个答案:

答案 0 :(得分:15)

您需要编写完整的表达式:

(a==0)||(b==0)

在第二个代码中:

if((p1.distanceFrom(l.p1)<= r) || (p1.distanceFrom(l.p2)<=r) )
    return 1;

如果您执行((a || b) == 0),则表示“逻辑或ab是否等于0.这不是您想要的。

作为旁注:if (BooleanExpression)return true; else return false模式可以缩短为return BooleanExpression;

答案 1 :(得分:2)

每次都必须单独指定条件:

if (a == 0) || (b == 0))
    bla bla;

当你这样做时

if ((a || b) == 0)
    bla bla;

它有不同的含义:(a || b)表示“如果a或b非零(即为真),则表达式的结果为真”。 所以当你做(a || b)== 0时,你正在检查前面解释的表达式的结果是否等于零(或假)。

答案 2 :(得分:2)

C ++语言指定||(“或”)的操作数是布尔表达式。

如果p1.distanceFrom(l.p1)不是布尔值(即,如果distanceFrom返回int,或double,或某个数字类类型),编译器将尝试将其转换为布尔值。

对于内置数值类型,转换为:非零转换为true,零转换为false。如果p1.distanceFrom(l.p1)的类型是类类型Foo,则编译器将调用一个(且仅一个)用户定义的转换,例如Foo::operator bool(),以将表达式的值转换为bool。 / p>

答案 3 :(得分:1)

我认为你真的想要这样的东西:

bool Circle2::contains(Line2 l) {
if((p1.distanceFrom(l.p1) <= r) || (p1.distanceFrom(l.p2) <= r)) return 1;
    return 0;
}

答案 4 :(得分:1)

模板乐趣:

template <typename T>
struct or_t
{
  or_t(const T& a, const T& b) : value1(a), value2(b)
  {
  }

  bool operator==(const T& c)
  {
    return value1 == c || value2 == c;
  }

private:
  const T& value1;
  const T& value2;
};

template <typename T>
or_t<T> or(const T& a, const T& b)
{
  return or_t<T>(a, b);
}

使用中:

int main(int argc, char** argv)
{
  int a = 7;
  int b = 9;

  if (or(a, b) == 7)
  {
  }

  return 0;
}

它执行与您通常所做的相同的比较,但是在您方便的时候。

答案 5 :(得分:1)

如果你有很多代码,你可以考虑一种帮助方法:

bool distanceLE (Point p1, Point p2, double threshold) {
    return (p1.distanceFrom (p2) <= threshold)
}

bool Circle2::contains (Line2 l) {
    return distanceLE (p1, l.p1, r) && distanceLE (p1, l.p2, r);
}

如果您有时有&lt ;,有时&lt; =,&gt;,&gt; =等等,也许您应该以函数的形式传递运算符。

在某些情况下,你写下这个意图:

if ((a || b) == 0) return 1;
return 0;

可以用bitwise或:

表示
if ((a | b) == 0) return 1;
return 0;

并简化为

return  ! (a | b);

但请阅读按位操作并仔细测试。我很少使用它们,尤其是我一段时间没有使用C ++。

请注意,您反映了示例1和2之间的含义,以相反的方式返回true和false。

当然,按位不太平等没有任何意义。 :)

答案 6 :(得分:0)

C ++不支持任何类似的构造。使用if (a == 0 || b == 0)

答案 7 :(得分:0)

您的情况应为(a == 0 || b == 0)(p1.distanceFrom(l.p1) <= r || p1.distanceFrom(l.p2)) <= r)

答案 8 :(得分:0)

C ++并不那么聪明。您必须手动进行每次比较。

bool Circle2::contains(Line2 l) {
if((p1.distanceFrom(l.p1) <= r) || (p1.distanceFrom(l.p2) <= r)) return 1;
    return 0;
}