C++ 为什么将三个变量与==一起比较的结果为false?

C++ 为什么将三个变量与==一起比较的结果为false?,c++,C++,以下程序的输出是“它们不相等”,但我希望“它们相等”,因为三个比较变量(x、y、和z)相等。为什么? #include <iostream> int main() { int y, x, z; y = 3; x = 3; z = 3; if (x == y == z) { std::cout << "they are equal\n"; } else { std::

以下程序的输出是“它们不相等”,但我希望“它们相等”,因为三个比较变量(
x
y
、和
z
)相等。为什么?

#include <iostream>

int main()
{
    int y, x, z;
    y = 3;
    x = 3;
    z = 3;

    if (x == y == z)
    {
        std::cout << "they are equal\n";
    }
    else
    {
        std::cout << "they are not equal\n";
    }
}
#包括
int main()
{
int y,x,z;
y=3;
x=3;
z=3;
如果(x==y==z)
{

这是因为表达式和类型的计算方式

让我们计算最左边的
=

x == y ...
计算结果为true。让我们重写表达式:

//  x == y
if (true   == z) {
    // ...
}
true
是一个布尔值。布尔值不能直接与
int
进行比较。必须将布尔值转换为整数,结果是
1
(是,
true
=
1
)。让我们将表达式重写为其等效值:

//  true
if (1    == z) {
    //    ^--- that's false
}
但是
z
不等于
1
。这个表达式是错误的

相反,应将两个布尔表达式分开:

if (x == y && y == z) {
    // ...
}

现在是一些实用的C++17应用程序。无需SFINAE

//----------------------------------
//constexpr lambda需要C++17
自动eq3=[](自动v1、自动v2、自动v3)constexpr->bool
{
返回(v1==v2)和&(v2==v3);
};
用法很简单,但完全在编译时使用

constexpr auto-same_q3(42,42,42);
标准::布尔常数孪晶;
对于比较整个值序列,概念是相同的,执行稍微复杂一点

模板
constexpr bool all_equal(const T&…args)
{
if((sizeof…(args)))<2)返回true;
//对于非递归版本
const auto il={args_u…};
//将它们全部与第一个进行比较
自动优先顺序=*(il.begin());
//假设
布尔·雷祖尔特{true};
用于(自动和删除:il){
//是的,我知道,第一个循环将第一个循环与它自身相比较。。。
rezult=rezult&&(第一个=元素);
//短路短路
如果(!rezult_uu)中断;
}
返回rezult;
};
“只是”一个函数,编译时,再也没有可变模板的把戏

bool_常数相同;

cout-related/dupe:
if(x==y==z)
不符合您的想法,因此我不能在一行中等效3个数字,而不分别等效每2个数字?因此我不能在一行中等效3个数字,而不分别等效每2个数字?您是正确的,您不能在一个表达式中这样做正确的。因为比较的计算结果是布尔值,然后您将把它和一个数字联系起来。