在比较表达式中使用递增/递减运算符 仍然学习C++,我想知道为什么比较两个操作数,比如在这个if语句: if (array[currentIndex] > array[currentIndex + 1]) std::swap(array[currentIndex], array[currentIndex + 1]);

在比较表达式中使用递增/递减运算符 仍然学习C++,我想知道为什么比较两个操作数,比如在这个if语句: if (array[currentIndex] > array[currentIndex + 1]) std::swap(array[currentIndex], array[currentIndex + 1]);,c++,C++,当使用递增运算符(前缀或后缀)以这种方式编写时,“小于”计算不起作用: 或者在for循环条件下使用递增/递减运算符时: for (int currentIndex = 0; currentIndex < --length; ++currentIndex) for(int currentIndex=0;currentIndex

当使用递增运算符(前缀或后缀)以这种方式编写时,“小于”计算不起作用:

或者在for循环条件下使用递增/递减运算符时:

for (int currentIndex = 0; currentIndex < --length; ++currentIndex)
for(int currentIndex=0;currentIndex<--length;++currentIndex)

任何解释都很好,谢谢。

在if语句的条件下运算符操作数的求值顺序

if (array[currentIndex] > array[++currentIndex])
            std::swap(array[currentIndex], array[++currentIndex]);
for (int currentIndex = 0; currentIndex < --length; ++currentIndex)
并且没有指定求值函数参数的顺序。所以这个语句产生未定义的行为

此外,如果假设指定了求值顺序,并且是从左到右的,那么在这种情况下变量
currentIndex
将增加两次。因此if语句的substate将处理数组的不同元素

至于循环语句

if (array[currentIndex] > array[++currentIndex])
            std::swap(array[currentIndex], array[++currentIndex]);
for (int currentIndex = 0; currentIndex < --length; ++currentIndex)
for(int currentIndex=0;currentIndex<--length;++currentIndex)

那就没什么不寻常的了
++currentIndex
在循环语句体之后求值,而条件
currentIndex<--length
在循环体之前求值。

不能盲目地用一个表达式替换另一个表达式。为什么?让我们看一个更简单的例子:

tmp = currentIndex + 1;
vs

有什么区别?因此,您将在
tmp
中获得相同的值,但第一个表达式不会更改变量
currentIndex
,而第二个表达式会更改。例如,您可以使用相同的结果多次执行第一个表达式,而第二个表达式每次都会给出不同的结果

另一方面,在更改变量和在同一表达式中使用它时,您需要小心—您很容易得到未定义的行为,因为编译器允许以不同的方式优化表达式,并且您不知道变量的确切更改时间。详情见

对于这个循环:

for (int currentIndex = 0; currentIndex < --length; ++currentIndex)
for(int currentIndex=0;currentIndex<--length;++currentIndex)

如果在同一个循环中使用,这似乎是与以前用
--length
替换为
--length
时相同的错误,问题是每次迭代都会检查条件,因此每次
length
都会减少。但
length-1
仅仅意味着您希望迭代一次小于数组大小,这在您使用
currentIndex+1
访问数组并且不希望访问无效索引时是有意义的。这是纯粹的推测或有根据的猜测,但如果没有上下文,很难确定。

第二个示例中
currentIndex
++currentIndex
的求值顺序未指定,因此您可以得到两个相同的值,也可以不确定。但是
for
循环在我看来很好,那么它有什么问题吗?
++var
var+1
不同。因为文档肯定对某些东西有用,这里是。@Quentin你能解释一下为什么在这种情况下没有指定求值顺序吗?非常感谢。@Quentin在C++17之前它是未定义的行为(您的评论让读者认为它是未指定的行为),即使有定义的顺序,第一个代码也会是错误的。OP似乎认为
++var
var+1
@Vlad是相同的,即使它从左到右求值,你也会比较,比如说元素
[0]
[1]
,然后交换
[1]
[2]
。而
currentIndex<--length
每次都会减少
length
,虽然定义明确,但很可能不是OP想要的。我很欣赏@mooingduck和@vlad的输入-你能解释一下为什么
++var
var+1
不一样吗?另外,你能解释一下为什么那个特殊的语句会产生未定义的行为吗?非常感谢你的帮助help@CoryGreenhalgh
++var
var+1
之间的区别是
++var
将增加存储在var中的值,并返回结果,其中as
var+1
将只返回
var
1
@VladfromMoscow的总和实际上我想你和c.liddell回答了我的问题用两种不同但有用的方式提问。我将进一步研究未指定的求值顺序,现在我知道
++var
将在表达式中使用时更改变量本身。这也让其他答案更加清晰,特别是
++var
!=
var+1
comment。这是一个很好的解释,谢谢。我认为我错误地认为使用
++var
会得到与表达式
var+1
相同的结果。我也没有意识到if语句中使用的表达式被视为任何其他表达式语句,即赋值/使用运算符的任何副作用都会影响上述变量,而不仅仅是if语句中的比较条件。