在 while 循环中递增顺序

Increment order in a while loop

本文关键字:顺序 while 循环      更新时间:2023-10-16

在这里,我有一个简单的算法,它通过将所有等于输入数字的奇数相加来计算数字的平方,这样:

1 = 1 = 1-squared
1 + 3 = 4 = 2-squared
1 + 3 + 5 = 9 = 3-squared

等等。算法如下:

int triangleSquare(int number) {
    int product = 0;
    int currentOdd = 1;
    while (number--) {
        product += currentOdd;
        currentOdd += 2;
    }
    return product;
}

我的问题是关于细分市场的:

while (number--) { ... }

出于某种原因,我在 while (--number)while (number--) 之间得到了不同的结果,我认为这是因为--number在执行 while 循环之前应该先递减(number--反之亦然)。我的问题是,为什么它会有所作为?无论增量顺序如何,while 循环不应该总是最后执行吗?我一定错过了一些明显的东西,但这对我来说似乎很奇怪,几乎就像number--使条件的行为像一个do {...} while()循环。

可以编写两个候选循环(等效于):

while (number-- != 0)
while (--number != 0)

考虑在循环入口处number == 1时会发生什么:

  1. number的值与零进行比较,然后递减;由于10,循环体被执行。
  2. number的值递减,然后比较为零;因为00的,循环体被执行。

这就是区别!

while (number--)执行以下操作

  1. 评估while (number)
  2. 然后number--

另一方面,while (--number)这样做:

  1. 计算--number
  2. 然后使用新值评估while (number)

这就是区别。

这是一种可怕的代码编写方式,但是...

表达式有两个特征:返回值和边影响。 减少是副作用;它是一样的对于--numbernumber--. while中的条件,但是,取决于返回值; --number返回递减后的值; number--前面的值递减。 当递减实际需要时变量上的位置没有真正指定(对于任何一个):一些在前面的序列点之后和下一个序列点之前的时间一。

换句话说:--number相当于:

int
decr( int& number )
{
    number -= 1;
    int results = number;
    return results;
}

number--相当于:

int
decr( int& number )
{
    int results = number;
    number -= 1;
    return return;
}

在这两种情况下,您都在测试函数的返回值。