Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在if条件下,左右更改值的相等性检查是否有任何差异_C++ - Fatal编程技术网

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放在左边是一个老办法,用来防止意外使用=而不是==。编译器现在会为这个错误生成一个适当的警告(试试看),所以请使用对您最有意义的语法。