下面是一个使用按位运算符添加两个数字的程序。虽然函数add中返回的最终值是预期的,但main函数中打印的值显示了一些垃圾值。任何人都可以解释这个未定义的行为并告诉我这里出了什么问题。下面的示例输出。
#include <stdio.h>
#include <string.h>
#include <windows.h>
int add (int, int);
int main ()
{
int n1 = 0, n2 = 0;
scanf("%d %d", &n1, &n2);
printf("\nSum: %d\n",add(n1, n2));
system("pause");
return 0;
}
int add (int a, int b)
{
printf("%d %d\n", a, b);
if (!a) {
return b;
} else {
add ((a & b) << 1, a ^ b);
}
}
示例输出: -
3 1
3 1
2 2
4 0
0 4
Sum: 2686756
答案 0 :(得分:6)
你需要在递归调用中返回add的结果
int add (int a, int b)
{
printf("%d %d\n", a, b);
if (!a) {
return b;
} else {
return add ((a & b) << 1, a ^ b);
}
}
可能是
int add (int a, int b)
{
if (!a) return b;
return add ((a & b) << 1, a ^ b);
}
答案 1 :(得分:2)
行add ((a & b)
...缺少return
,所以它只是从堆栈中返回一个随机数。
答案 2 :(得分:0)
我可能错了(C离开的时间很长)但是
if (!a) {
不是&#34;不是&#34;运营商。
它将是真实的&#34;对于每个值,除了0
编辑:
见其他答案。但是在c ++中工作:)