0

我正在学习 C,我想出了这个例子

     #include <stdio.h>

     int MyAdd(int);
     main ()
     {
          int i;
          int c = 0;
          c = MyAdd(5); 
          printf("%d\n", c);
     }

     int MyAdd(int a)
     {
          if(a > 0)
               return a + MyAdd(--a);
          else
               return 0;
     }

我自己运行它,我计算出 15。(5 +4+3+2+1)但是当我运行它时,我得到 10......为什么?在第一次,我们不会得到 5+(再次执行函数)等等..?

4

2 回答 2

6

当在表达式中使用时,副作用运算符会做一些有趣的、意想不到的事情,因为你基本上受编译器的支配。

在这种情况下,您的编译器正在评估第一个操作数a + MyAdd(--a)之前的第二个操作数。因此,在加法中使用它之前,您要递减变量。

无论如何,您实际上并不需要减量运算符。我建议将该行重写为return a + MyAdd(a - 1);.

于 2013-11-15T10:58:18.257 回答
0

做类似的事情:

foo(a++) or
foo(++a)

不是很安全,因为您依赖于 Compiler 实现——这意味着它是从左到右还是从右到左读取参数。

让我们考虑第一种情况:

foo(a++)

如果编译器从左到右读取参数,结果将是调用 foo(a) 然后是 a++。如果从右到左读取参数,结果将是调用 f(a+1)

于 2013-11-15T12:15:56.887 回答