我有一个奇特的递归函数,是这样的:
不知道它可以省略 return ,“if”的分支不返回一个valué但它的工作原理¿我想知道这是否是C或编译器中的有效行为取决于?
答案 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);
}