C程序中未定义的行为。请解释

时间:2014-04-17 02:30:54

标签: c

下面是一个使用按位运算符添加两个数字的程序。虽然函数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

3 个答案:

答案 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 ++中工作:)