if((a || b) == 0) return 1;
return 0;
所以是这样的……如果a或b等于零,那么……但它对我没有起作用。 我的真实代码是:
bool Circle2::contains(Line2 l) {
if((p1.distanceFrom(l.p1) || p1.distanceFrom(l.p2)) <= r) {
return 1;
}
return 0;
}
if((a || b) == 0) return 1;
return 0;
所以是这样的……如果a或b等于零,那么……但它对我没有起作用。 我的真实代码是:
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;
在IT技术中,“(a || b)”有不同的含义:它表示“如果a或者b中有一个非零(即true),那么这个表达式的结果就是true”。 因此,当你执行“(a||b) == 0”时,你是在检查先前解释过的表达式的结果是否等于零(或false)。
模板的乐趣:
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;
}
它执行与您通常执行的相同比较,但更加方便。
C++语言规定||
(或)的操作数必须是布尔表达式。
如果p1.distanceFrom(l.p1)
不是布尔类型(也就是说,如果distanceFrom
返回int、double或某些数字类类型),编译器会尝试将其转换为布尔类型。
对于内置的数字类型,转换规则是:非零值会转换为true,零值会转换为false。如果p1.distanceFrom(l.p1)
的类型是类类型Foo
,编译器将调用一个(且仅调用一个)用户定义的转换函数,例如Foo::operator bool()
,来将表达式的值转换为bool类型。
我认为你真正想要的是这样的:
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);
}
如果你有时使用 <,有时使用 <=,>,>= 等等,也许你应该将运算符作为函数传递。
在某些情况下,你写这个的意图可能是:
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++并不是那么智能的。你必须手动进行每个比较。
bool Circle2::contains(Line2 l) {
if((p1.distanceFrom(l.p1) <= r) || (p1.distanceFrom(l.p2) <= r)) return 1;
return 0;
}
C++不支持这样的结构。请使用if (a == 0 || b == 0)
。
a
和b
都为false,(a || b) == 0
将为真。 - Cat Plus Plus(a || b) == 0
将为真,如果至少有一个为假,则为假。 - Jaanus你的条件应该是 (a == 0 || b == 0)
或者 (p1.distanceFrom(l.p1) <= r || p1.distanceFrom(l.p2)) <= r)
0
代表假,1
代表真。基于这个理解,回答你的第一个问题(代码1):return !(a && b);
return !a || !b;
bool Circle2::contains(Line2 l) {
return p1.distanceFrom(l.p1) <= r || p1.distanceFrom(l.p2) <= r;
}
<= r
(代码4):bool Circle2::contains(Line2 l) {
for (auto p : { l.p1, l.p2 }) {
if (p1.distanceFrom(p) <= r) {
return true;
}
}
return false;
};
for
循环初始化一个包含两个值l.p1
和l.p2
的匿名数组,并逐个检查每个值,如果找到满足条件的点,则立即返回true
。这意味着它会像||
一样进行短路运算。只有在两个点都被发现不满足条件后才会返回false
。我建议在这种情况下使用类似于代码3的方式,因为只需要检查两个点,可以用简单的||
表达式来实现。在另一种情况下,如果需要检查大量的点,类似于代码4的方式会很有用。
return 1;
,并认为return 0;
是 "then" 子句,而不是隐式的 "else" 子句。 - CodesInChaosreturn true
或者return false
语句。虽然编译器可以正确解析此语句,但是如果你要声明布尔类型,请至少使用bool关键字。 - Randolphoreturn 1
! - Marlonif (i|j|k) == (10|20)
之类的内容的语言,其含义是“i、j或k中的任意一个等于10或20”... http://www.cs.arizona.edu/icon/ - 6502