还在学习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]);
任何解释都很好,谢谢。
答案 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
。