下面的代码给出了答案(下面进一步说明),我不明白。
#include <stdio.h>
int fA (int x) {
int w = x;
printf("%d", x);
if (x > 4)
w += fA(x - 2);
if (x > 2)
w += fA(x - 4);
printf("%d", x);
return w;
}
int fB (int x) {
if (x < 1)
return 1;
int w = x;
if (x > 2)
w = w * fB(x - 1);
if (x > 1)
w= w + fA(x - 1);
return w;
}
int main (void) {
printf("\n %d %d \n", fA(6), fB(3));
return 0;
}
打印
112264004226
12 11
问题是为什么? 在我看来,它应该以{{1}}开头。 谢谢!
答案 0 :(得分:5)
无法保证以任何特定顺序评估函数的参数。
因此,当您使用printf
和fA(6)
作为参数调用fB(3)
时,编译器可以自由地调用其中一个。
在这种特殊情况下,首先评估fB(3)
。但是如果你使用不同的编译器,它可能首先评估fA(6)
。
答案 1 :(得分:3)
没有明确的订单。这取决于编译器,例如:
# gcc -v
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include- dir=/usr/include/c++/4.2.1
Apple LLVM version 7.0.2 (clang-700.1.81)
Target: x86_64-apple-darwin14.5.0
Thread model: posix
这会产生
640042261122
12 11
此外 - 相同的编译器可能会决定优化顺序
答案 2 :(得分:1)
这是一个难题吗?
我想你会期望它从6开始,因为fA(6)首先出现。但printf的参数正在以相反的顺序(由我的编译器; YMMV)进行评估,因此首先调用fB(3)。