[英]Increment order in a while loop
在这里,我有一个简单的算法,通过将等于输入数字的所有奇数加起来来计算数字的平方,这样:
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
时会发生什么:
number
的值与零进行比较,然后递减; 由于1
不为0
,因此执行循环体。 number
的值递减,然后与零比较; 由于0
为0
,因此不执行循环体。 就是这样!
while (number--)
执行以下操作:
while (number)
number--
另一方面while (--number)
这样做:
--number
while (number)
就是这样。
这是编写代码的可怕方式,但是...
表达式具有两个特征:返回值和副作用。 递减是副作用; --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;
}
在这两种情况下,您都在测试函数的返回值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.