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个数字?您是正确的,您不能在一个表达式中这样做正确的。因为比较的计算结果是布尔值,然后您将把它和一个数字联系起来。