1

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

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

4

3 回答 3

3

两个候选循环可以写成(等价于):

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

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

  1. 的值number与零比较,然后递减;因为1is not 0,所以循环体被执行。
  2. 的值number递减,然后与零比较;因为0is ,所以执行0循环体。

这就是区别!

于 2013-09-12T16:01:38.763 回答
2

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

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

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

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

这就是区别。

于 2013-09-12T16:03:55.257 回答
1

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

表达式有两个特征:返回值和副作用。递减是副作用;--number和也是一样的number--。但是,中的条件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;
}

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

于 2013-09-12T16:03:24.340 回答