这可以以某种方式完成吗?
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;
}
您需要写出完整的表达式:
(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;
每次都必须单独指定条件:
if (a == 0) || (b == 0))
bla bla;
当你这样做时
if ((a || b) == 0)
bla bla;
它有不同的含义:(a || b) 表示“如果 a 或 b 为非零(即 true),则该表达式的结果为 true”。 因此,当您执行 (a||b) == 0 时,您正在检查先前解释的表达式的结果是否等于零(或假)。
C++ 语言规定
||
(“或”)的操作数是布尔表达式。
如果
p1.distanceFrom(l.p1)
不是布尔值(即,如果 distanceFrom
返回 int、double 或某些数字类类型),编译器将尝试将其转换为布尔值。
对于内置数字类型,转换为:非零转换为 true,零转换为 false。如果
p1.distanceFrom(l.p1)
的类型是类类型 Foo
,编译器将调用一个(且仅一个)用户定义的转换,例如 Foo::operator bool()
,将表达式的值转换为 bool。
模板的乐趣:
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;
}
它执行的比较与您通常执行的比较相同,但是是在您方便的时候进行的。
我想你真的想要这样的东西:
bool Circle2::contains(Line2 l) {
if((p1.distanceFrom(l.p1) <= r) || (p1.distanceFrom(l.p2) <= r)) return 1;
return 0;
}
如果你有很多这样的代码,你可以考虑一个帮助方法:
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。
当然,按位不相等没有任何意义。 :)
C++ 不支持任何类似的构造。使用
if (a == 0 || b == 0)
。
您的情况应该是
(a == 0 || b == 0)
或 (p1.distanceFrom(l.p1) <= r || p1.distanceFrom(l.p2)) <= r)
C++ 没那么聪明。您必须手动进行每个比较。
bool Circle2::contains(Line2 l) {
if((p1.distanceFrom(l.p1) <= r) || (p1.distanceFrom(l.p2) <= r)) return 1;
return 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。