C++ 在if条件下,左右更改值的相等性检查是否有任何差异
以下两段代码之间有什么区别吗C++ 在if条件下,左右更改值的相等性检查是否有任何差异,c++,C++,以下两段代码之间有什么区别吗 if(x==4) { } 及 如果是这样,对性能有很大影响吗?会有区别吗?对如果比较中涉及的类型之一是用户定义的,则该类型的编写器可以使其运算符==重载不可交换 但是,此类代码应被视为行为不良。用户期望平等测试是可交换的。在C++20中,编写交换等式测试比编写非交换等式测试容易得多 因此,虽然编译器不会阻止您,但假设相等测试是可交换的是合理安全的。会有区别吗?对如果比较中涉及的类型之一是用户定义的,则该类型的编写器可以使其运算符==重载不可交换 但是,此类代码应
if(x==4)
{
}
及
如果是这样,对性能有很大影响吗?会有区别吗?对如果比较中涉及的类型之一是用户定义的,则该类型的编写器可以使其
运算符==
重载不可交换
但是,此类代码应被视为行为不良。用户期望平等测试是可交换的。在C++20中,编写交换等式测试比编写非交换等式测试容易得多
因此,虽然编译器不会阻止您,但假设相等测试是可交换的是合理安全的。会有区别吗?对如果比较中涉及的类型之一是用户定义的,则该类型的编写器可以使其
运算符==
重载不可交换
但是,此类代码应被视为行为不良。用户期望平等测试是可交换的。在C++20中,编写交换等式测试比编写非交换等式测试容易得多
因此,虽然编译器不会阻止您,但可以合理地安全地假设相等性测试是可交换的。在最常见的情况下(请阅读:“您是否应该使用您的重载运算符==
,这会使它有所不同,并且x
的类型是否应该与4
相比较”)这两个代码段具有相似的性能:将对这两个术语进行求值,然后进行比较
然而,至少在方法上存在差异。例如,如果您偶然写下:
int x = 2;
if(x = 4) // = instead of ==, typed by mistake
{
stuff();
}
这将编译(您可能有警告,但没有错误),并且在运行时,这将在测试时将4
放入x
。由于x
不等于零,将执行块的内容:stuff()
。因此会有一个bug,因为您的意图是不更改x
,也不执行块的内容
但如果你写这封信:
int x = 2;
if(4 = x) // = instead of ==, typed by mistake
{
stuff();
}
此代码不会编译,因为4是一个不能在此类赋值的左侧部分使用的运算符。在最常见的情况下(请阅读:“您是否应该使用您的重载运算符==
,这会使它有所不同,并且x
的类型是否应该与4
类似”)这两个代码段具有相似的性能:将对这两个术语进行求值,然后进行比较
然而,至少在方法上存在差异。例如,如果您偶然写下:
int x = 2;
if(x = 4) // = instead of ==, typed by mistake
{
stuff();
}
这将编译(您可能有警告,但没有错误),并且在运行时,这将在测试时将4
放入x
。由于x
不等于零,将执行块的内容:stuff()
。因此会有一个bug,因为您的意图是不更改x
,也不执行块的内容
但如果你写这封信:
int x = 2;
if(4 = x) // = instead of ==, typed by mistake
{
stuff();
}
这段代码不会编译,因为4是一个不能在这样一个作业的左边部分使用的代码。什么是
x
?答案在某种程度上取决于x
的类型,以及=
是否过载。是什么特别阻止你编写两个简单的测试程序,以及它们需要多长时间才能跑?@SamVarshavchik:因为这不能回答问题。它只会为这个具体的例子提供一个答案。在特定的编译器上。在那台特定的机器上运行。将4放在左边是一个老办法,用来防止意外使用=而不是==。编译器现在会为这个错误生成一个适当的警告(试试看),所以使用对您最有意义的语法。x
的类型是什么?答案多少取决于x
的类型,以及=
是否过载。是什么特别阻止您编写两个简单的测试程序,以及它们需要多长时间才能跑?@SamVarshavchik:因为这不能回答问题。它只会为这个具体的例子提供一个答案。在特定的编译器上。在那台特定的机器上运行。将4放在左边是一个老办法,用来防止意外使用=而不是==。编译器现在会为这个错误生成一个适当的警告(试试看),所以请使用对您最有意义的语法。