奇怪的布尔转换(?)

时间:2014-05-29 18:34:50

标签: c++

解释为什么第二个表达式返回false

   cout << (4==4) << endl; //1
   cout << (4==4==4) << endl; // 0

3 个答案:

答案 0 :(得分:13)

(4==4==4)基本上是((4==4)==4)(true == 4)(1==4) 1 false 2 0打印。

请注意,==具有关联性left-to-right,但这并不重要(在情况下),因为即使它具有从右到左的关联性,结果会是一样的。


1。由于整体推广。
2。请注意,有人可能会认为4(true==4)可被视为true(在所有4非零之后,因此true)。这种想法可能得出结论(true==4) (true==true)true。但这不是它的工作原理。将bool提升为int,而不是int提升为bool。

答案 1 :(得分:2)

4==4评估为true,为了将其与4进行比较,将其转换为11 == 4false,即0

答案 2 :(得分:1)

你不能合理地将二元比较运算符应用于两个以上的操作符(除非你有覆盖使其成为可能,不知何故)。

比较未知数量的参数:

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

C ++ 11