几天前
#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;
}