这可以以某种方式完成吗?
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;
}
答案 0 :(得分:15)
您需要编写完整的表达式:
(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;
答案 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;
}