几天前

     #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;
     }

为什么结果是10而不是15我得到了答案
在表达式中使用时,副作用运算符会做一些有趣的、出乎意料的事情,因为基本上由编译器决定。
在这种情况下,编译器将在第一个运算符之前计算a+MyAdd(--a)的第二个运算符。所以,在将变量用作加法之前,先将其递减。
明白了我只是在玩我的代码,我用--i替换i--,我的编译器没有得到任何错误,当我运行它时,我得到了Segmentation fault (core dumped),我试图理解为什么会发生这种情况。

最佳答案

(一)
“我有分段错误(核心转储)”
在这段代码中,您可以看到每次调用MyAdd函数时,都会向它传递一个较小的参数(因为--a):

#include <stdio.h>

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

     int MyAdd(int a)
     {
          int  res = 0;

          if(a > 0) {
            res += a + MyAdd(--a);
            printf("%d\n", res);
            return res;
          }
          else
               return 0;
     }

输出:
0     // you pass 1 to your function and decrement the argument
1     // you pass 2
3     // you pass 3
6     // you pass 4
10    // you pass 5. Because you decrement the argument each time
      // you pass it to your function, this will return normal result.
result: 10

但如果将--a更改为a--,则始终会将5传递到MyAdd函数。
这将导致无限循环,因为:(5 + (5 + (5 + (5 + ...如您所见,5总是大于0,因此if将始终递归调用MyAdd函数。。。
因此返回值将不断增加,直到发生溢出:
ISO C99标准规定整数溢出会导致“未定义”
“行为”,这意味着符合标准的编译器可以
任何他们喜欢的,从完全忽略溢出到中止
程序大多数编译器似乎忽略了溢出,导致
存储的意外或错误的结果。
2个)
“为什么结果是10而不是15”
第一次调用MyAdd时,最好考虑传递给函数的参数。那么你将得到15而不是10:
#include <stdio.h>

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

     int MyAdd(int a)
     {
          int  res = a;    // here it is

          if(a > 0) {
            res +=  MyAdd(--a);
            printf("%d\n", res);
            return res;
          }
          else
               return 0;
     }

07-28 02:53