C++ 奇异布尔转换(?)
请解释为什么第二个表达式返回falseC++ 奇异布尔转换(?),c++,C++,请解释为什么第二个表达式返回false cout << (4==4) << endl; //1 cout << (4==4==4) << endl; // 0 cout(4==4==4)基本上是((4==4)==4)这是(true==4)这是(1==4)这是这是这是假的这是打印成0的 请注意,=具有关联性,但这并不重要(在本例中),因为即使它具有从右到左的关联性,结果也会是相同的 一,。由于整体推广 2.请注意,人们可能会认为中的4
cout << (4==4) << endl; //1
cout << (4==4==4) << endl; // 0
cout(4==4==4)
基本上是((4==4)==4)
这是(true==4)
这是(1==4)
这是这是这是假的这是打印成0
的
请注意,=
具有关联性,但这并不重要(在本例中),因为即使它具有从右到左的关联性,结果也会是相同的
一,。由于整体推广
2.请注意,人们可能会认为中的4
(true==4)
可以被视为true
(毕竟4
是非零的,因此true
)。这种想法可能会得出这样的结论:(true==4)
是(true==true)
这是真的
。但事实并非如此。它是提升为int的bool,而不是int到bool。4==4
计算为true
,为了与4
进行比较,将其转换为1
1==4
为false
,即0
您不能合理地将二进制比较运算符应用于两个以上的运算符(除非您有一个覆盖使其成为可能)
要比较未知数量的参数,请执行以下操作:
#include <iostream>
template <typename A, typename B>
bool equal(const A& a, const B& b) {
return a == b;
}
template <typename A, typename B, typename ... Other>
bool equal(const A& a, const B& b, const Other& ... other) {
return a == b && equal(b, other ...);
}
int main() {
std::cout << equal(1, 1, 1) << '\n';
std::cout << equal(1, 2, 3) << '\n';
}
#包括
模板
布尔相等(常数A和A,常数B和B){
返回a==b;
}
模板
布尔相等(常数A和A、常数B和B、常数其他和…其他){
返回a==b&&equal(b,其他…);
}
int main(){
std::cout那么我如何比较3个元素呢?@OrangeFox:if((x==4)和&(y==4))
它被称为促销
是有原因的;您可以统一到更通用的type@ScarletAmaranth:Yes.:-@MooingDuck:避免递归,改用迭代怎么样?…只有它使用数组;我们才能避免这种情况,减少堆栈使用和拷贝吗?EWW;不要在这里强制使用copyable;按const-ref执行;您所需要的只是相等可比