提问人:SeriousN00b 提问时间:7/19/2023 最后编辑:JabberwockySeriousN00b 更新时间:7/20/2023 访问量:95
C++ 中的平等 [重复]
Equality in C++ [duplicate]
问:
我仍在学习通过 C++ 编程的基础知识,并尝试了一些关于 C++ 运算符的应用程序,但似乎有些东西我仍然不明白。
我尝试编写以下行来测试使用等于 (==) 作为三元运算符的可能性:
cout << "(2+2 == 2*2 == pow(2, 2)) == " << (2+2 == 2*2 == pow(2, 2)) << endl;
输出为 0
因此,我怀疑这可能是因为 pow(2,2) 的返回值是双精度值,而前两个操作数的返回值是整数,因此我尝试了以下操作:
cout << "(2+2 == 2*2 == int(pow(2, 2))) == " << (2+2 == 2*2 == int(pow(2, 2))) << endl;
cout << "(double(2+2) == double(2*2) == pow(2, 2)) == " << (double(2+2) == double(2*2) == pow(2,2)) << "\n\n";
两行代码的输出也是 0。
我还尝试使用括号来减少操作数的数量,但最终得到了相同的输出。
答:
C++ 不会按照您想象的方式工作。您可以将多个比较放在一起,但它们将有一个做事的顺序。
让我们以此为例: .这意味着“让我们比较 2+2 和 2*2,结果是'真'(1)。然后让我们将 'true' 与 pow(2,2) 进行比较,这是不相等的,所以让我们返回 'false' (0)”(2+2 == 2*2 == pow(2, 2))
因此,这意味着您不能仅仅将多个值放在一起进行比较。它与“2*3+2”相同,不知何故与“2*3”和“3+2”不同,它是单一的。
简而言之:你只能通过价值来比较两件事。如果你需要更多,你需要将它们分成两组,然后用“and”连接它们。所以这有效:(2+2 == 2*2 && 2*2 == pow(2, 2))
评论
a == b == c
没有做你期望它做的事情!它首先计算 ,即 或 – 或作为整数值 或 – 然后将该值与此值进行比较 – 因此您只能得到 if compares 等于 either or 的最终值,这在给定情况下是无法得到的。为了实现与数学的等价性,您需要将一个值与其他两个值进行比较两次,例如a == b
true
false
1
0
c
true
c
0
1
a = b = c
a == b && a == c
你选择比较两次的值中的哪一个对最终结果并不重要——但你不应该计算两次相同的值(至少如果这是一个复杂的计算);如果计算了所有三个值,则将要比较的两个值存储在临时变量中;在具体情况下:
int tmp = 2 + 2;
// (admitted, SUCH A SIMPLE ONE would not be worth the
// effort, compiler would optimize it anyway)
std::cout << (tmp == 2*2 && tmp == pow(2,2));
但请注意:引入浮点 - 虽然如果输入是整数,它仍然会产生正确的结果,但您可能会遇到其他值的舍入问题(例如,请参阅此处或在此处搜索 SO 以比较浮点值),因此(除了在这里矫枉过正)如果您真的想使用它,您总是应该三思而后行(是的, 有有效的用例......pow
评论
int
2u
因为比较具有从左到右的关联性,所以表达式==
2+2 == 2*2 == pow(2, 2)
真的等于
(2+2 == 2*2) == pow(2, 2)
这意味着您将把 的结果与 的结果进行比较。2+2 == 2*2
pow(2, 2)
因为等于第一次比较的结果将是 .然后将其隐式转换为值,然后将其与调用结果进行比较。2+2
2*2
true
1
pow(2,2)
并且是错误的。然后显示为等效的数值。1 == pow(2,2)
0
还有一些吹毛求疵:三向比较并不是真正的三向比较,如上所示,它实际上是两个独立的比较。所以这不是“三元运算符”。
C++实际上只有一个三元运算符,那就是条件运算符。?:
评论
x == y == z
从左到右评估。在您的例子中是 ,并且(表示为 )不等于 。2+2 == 2*2
true
true
1
pow(2,2)
pow
pow
double
pow