在比较表达式中使用递增/递减运算符

时间:2017-05-24 00:05:10

标签: c++

还在学习C ++,我想知道为什么在比较两个操作数时,比如在这个if语句中:

send_from_directory()

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

if (array[currentIndex] > array[currentIndex + 1])
            std::swap(array[currentIndex], array[currentIndex + 1]);

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

if (array[currentIndex] > array[++currentIndex])
            std::swap(array[currentIndex], array[++currentIndex]);

任何解释都很好,谢谢。

2 个答案:

答案 0 :(得分:2)

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

tmp = currentIndex + 1;

VS

tmp = ++currentIndex;

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

另一方面,你需要小心改变变量并在同一个exression中使用它 - 你可以轻松获得未定义的行为,因为编译器允许以不同的方式优化展示,而你不知道何时会改变变量。可以找到详细信息here

至于这个循环:

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

如果它在同一循环中使用,这似乎与length - 1替换为--length之前的错误相同,问题是每次迭代检查条件,因此每次length都会减少。但是length - 1只是意味着你想要迭代一次小于数组的大小,这在你使用currentIndex + 1访问数组并且不想访问无效索引时是有意义的。这是纯粹的推测或有根据的猜测,但没有背景,很难肯定地说。

答案 1 :(得分:0)

在if语句的条件下评估运算符>的操作数的顺序

if (array[currentIndex] > array[++currentIndex])
            std::swap(array[currentIndex], array[++currentIndex]);

并未指定评估函数参数的顺序。所以这个陈述产生了未定义的行为。

此外,如果假设评估的顺序是指定的,并且从左到右,则变量currentIndex在这种情况下增加两倍。所以if语句的子语句将处理数组的不同元素。

至于循环语句

for (int currentIndex = 0; currentIndex < --length; ++currentIndex)
然后没有什么不寻常的。 ++currentIndex在循环语句的主体之后进行求值,同时在循环体之前计算条件currentIndex < --length