在功能上特别使用返回

时间:2014-12-03 22:54:39

标签: c return

我有一个奇特的递归函数,是这样的:

不知道它可以省略 return ,“if”的分支不返回一个valué但它的工作原理¿我想知道这是否是C或编译器中的有效行为取决于?

3 个答案:

答案 0 :(得分:2)

这是未定义的行为。

它通常适用于大多数情况,因为count将其返回值存储在返回值的正常位置(CPU上的AX寄存器),因此调用者找到返回值,即使函数没有显式返回值。

但是,应该避免这种情况 它可能会导致编译器警告,静态分析工具应始终将此标记为严重问题。


该功能可以简单地修复:

int count(int num, int t)
{
    if (num)
    {
        t +=  1 << (num%10) * 6;
        return count(num / 10, t); // added the return keyword here.
    }
    else
        return t;
}

答案 1 :(得分:2)

即使在具有非void返回类型的函数中,return语句也绝不是必需的。但是如果省略return语句并且调用者使用该值,则行为是未定义的。在main中有一个例外,如果省略return语句,就好像有一个return 0;

  

(C99,6.9.1p12)“如果达到了终止函数的},并且调用者使用了函数调用的值,则行为是未定义的。”

在递归count函数的特定情况下,永远不会访问返回值,因此调用该函数不会调用未定义的行为。

答案 2 :(得分:1)

一种替代方法(注意将int更改为uint64_t):

typedef unsigned long long uint64_t;

uint64_t count(uint64_t num, uint64_t t)
{
    if (!num)
        return t;
    t +=  1ull << (num%10) * 6;
    return count(num / 10, t);
}

第二个功能的相同类型的更改:

int check(int min, int max, int num, int b, int t, int es)
{
    if(min > max)
        return es > 0 ? 1 : 0; 
    b = num / min;
    if (min * b == num && ((min % 10) || (b%10))
        && t == cant(min, 0) + cant(b, 0) )
        printf("%d = %d x %d\n", num, min, b), es++;
    return check(min + 1, max, num, b, t, es);
}