C++ 中的平等 [重复]

Equality in C++ [duplicate]

提问人:SeriousN00b 提问时间:7/19/2023 最后编辑:JabberwockySeriousN00b 更新时间:7/20/2023 访问量:95

问:

我仍在学习通过 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++ 类型 运算符 相等

评论

1赞 wohlstad 7/19/2023
x == y == z从左到右评估。在您的例子中是 ,并且(表示为 )不等于 。2+2 == 2*2truetrue1pow(2,2)
0赞 Yksisarvinen 7/19/2023
我一直在寻找重复的,但与此同时你已经得到了答案。尽管如此,对于整数,这里也值得一读:为什么 pow(n,2) 在我的编译器和操作系统中,当 n=5 时返回 24?pow
0赞 Yunnosch 7/19/2023
以上是 C,但概念相同,误解相同。
0赞 463035818_is_not_an_ai 7/19/2023
顺便说一句,不仅是 is 的返回值,还有参数类型。 不适用于整数。powdoublepow
0赞 Sam Varshavchik 7/19/2023
C++太复杂了。尝试随机的事情,“测试它们以某种可疑方式工作的可能性”,很少会成功。有效学习 C++ 的唯一方法是遵循一本好的 C++ 教科书中的有组织的学习课程。

答:

2赞 Sami Kuhmonen 7/19/2023 #1

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))

评论

0赞 SeriousN00b 7/19/2023
非常感谢你,从没想过这么快的回复,请原谅我的无知,我对整个编程和 C++ 哈哈 有点陌生
5赞 Aconcagua 7/19/2023 #2

a == b == c没有做你期望它做的事情!它首先计算 ,即 或 – 或作为整数值 或 – 然后将该值与此值进行比较 – 因此您只能得到 if compares 等于 either or 的最终值,这在给定情况下是无法得到的。为了实现与数学的等价性,您需要将一个值与其他两个值进行比较两次,例如a == btruefalse10ctruec01a = b = ca == 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

评论

0赞 SeriousN00b 7/19/2023
谢谢程序员:)
0赞 SeriousN00b 7/20/2023
我理解您想对 pow() 函数说什么,但是对临时变量使用“无符号”类型有什么意义?
0赞 Aconcagua 7/20/2023
@SeriousN00b 这里实际上没有,你也可以使用signed int,没关系。只有涉及正值与符号文字,人们可以很容易地为两者争论。我鼓励在负值毫无意义的情况下使用无符号值(例如物体的尺寸,您是否见过直径为 -10 厘米的球???)来准确表达这一事实(例如,数组的长度也不能为负数)。
0赞 Aconcagua 7/20/2023
@SeriousN00b 在给定情况下,切换到 可能看起来更自然,因为也不使用无符号文字 ()。我个人对无符号类型有轻微的倾向,因为它们没有未定义的行为问题,例如在溢出或位操作上——在那些真的无关紧要的情况下......int2u
3赞 Some programmer dude 7/19/2023 #3

因为比较具有从左到右的关联性,所以表达式==

2+2 == 2*2 == pow(2, 2)

真的等于

(2+2 == 2*2) == pow(2, 2)

这意味着您将把 的结果与 的结果进行比较。2+2 == 2*2pow(2, 2)

因为等于第一次比较的结果将是 .然后将其隐式转换为值,然后将其与调用结果进行比较。2+22*2true1pow(2,2)

并且是错误的。然后显示为等效的数值。1 == pow(2,2)0


还有一些吹毛求疵:三向比较并不是真正的三向比较,如上所示,它实际上是两个独立的比较。所以这不是“三元运算符”。

C++实际上只有一个三元运算符,那就是条件运算符。?:

评论

0赞 SeriousN00b 7/19/2023
谢谢程序员:)