C++“或”运算符

问题描述 投票:0回答:10

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

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

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

bool Circle2::contains(Line2 l) {
    if((p1.distanceFrom(l.p1) || p1.distanceFrom(l.p2)) <= r) {
        return 1;
    }
    return 0;
}
c++ programming-languages codeblocks
10个回答
19
投票

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

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

在第二个代码中:

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

如果你这样做

((a || b) == 0)
这意味着“
a
b
的逻辑或等于 0。这不是你想要的。

顺便说一句:

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


2
投票

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

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

当你这样做时

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

它有不同的含义:(a || b) 表示“如果 a 或 b 为非零(即 true),则该表达式的结果为 true”。 因此,当您执行 (a||b) == 0 时,您正在检查先前解释的表达式的结果是否等于零(或假)。


2
投票

C++ 语言规定

||
(“或”)的操作数是布尔表达式。

如果

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

对于内置数字类型,转换为:非零转换为 true,零转换为 false。如果

p1.distanceFrom(l.p1)
的类型是类类型
Foo
,编译器将调用一个(且仅一个)用户定义的转换,例如
Foo::operator bool()
,将表达式的值转换为 bool。


2
投票

模板的乐趣:

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;
}

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


1
投票

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

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

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);
}

如果有时有 <, sometimes <=, >、>= 等,也许您也应该以函数的形式传递运算符。

在某些情况下,您可以这样写:

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

可以用按位或来表示:

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

并简化为

return  ! (a | b);

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

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

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


0
投票

C++ 不支持任何类似的构造。使用

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


0
投票

您的情况应该是

(a == 0 || b == 0)
(p1.distanceFrom(l.p1) <= r || p1.distanceFrom(l.p2)) <= r)


0
投票

C++ 没那么聪明。您必须手动进行每个比较。

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

0
投票

以下是一个简洁的解决方案:

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

||
是逻辑或运算符;因此,当且仅当
a
b
或两者都为 true 时,上述函数才会返回 true。

© www.soinside.com 2019 - 2024. All rights reserved.