以计算斐波那契数列(0,1,1,2,3,5,8,13...后一个数等于前两个数之和)为例,使用Java语言编写如下代码没有问题能正常计算结果。
void fibonacci(int n) {
if (n < 0)
System.out.println("n不能小于0");
if (n == 0)
System.out.printf("第%d位斐波那契数为:%d\n", n + 1, 0);
else if (n == 1 || n == 2)
System.out.printf("第%d位斐波那契数为:%d\n", n + 1, 1);
else {
int res = 2, pre = 1;
for (int i = 4; i <= n; i++) {
res = pre + (pre = res);
}
System.out.printf("第%d位斐波那契数为:%d\n", n + 1, res);
}
}
但同样的逻辑使用C语言则计算结果错误(0,1,1,2,4,8,16,32),似乎对于循环体中:res = prev + (prev = res);表达式的计算是先执行了括号内的赋值操作然后再求和的。c底层是如何实现这种表达式的计算的?
void fibonacci(int n) {
if (n < 0) {
puts("n不能小于0");
} else if (n == 0) {
printf("第%d位斐波那契数列为:%d\n", n + 1, 0);
} else if (n == 1 || n == 2) {
printf("第%d位斐波那契数列为:%d\n", n + 1, 1);
} else {
int res = 2, prev = 1;
for (int i = 4; i <= n; i++) {
res = prev + (prev = res);
}
printf("第%d位斐波那契数列为:%d\n", n + 1, res);
}
}