C

时间:2016-01-29 15:31:16

标签: c operator-precedence

下面的代码给出了答案(下面进一步说明),我不明白。

#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​​}}开头。 谢谢!

3 个答案:

答案 0 :(得分:5)

无法保证以任何特定顺序评估函数的参数。

因此,当您使用printffA(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)。