我有一个关于返回函数本身值的简单问题。当然,功能是递归的。 例如:
int CountDigs(int n)
{
int dig=n%10;
if(n < 10) return 0;
if( (n/10)%10 > dig )
return CountDigs(n/10)+1;
return CountDigs(n/10);
}
我通常会返回一个数字或变量,所以这是我第一次看到这个。有人可以请说明&#34; + 1&#34;存储在内存中,为什么我不应该创建一个存储摘要的变量?
更具体地说,我疯了同样的解决方案,但不同:
int counting_function(int n)
{
int sum;
if (n>=9)
return 0;
sum = counting_function (n/10);
if (n%10 < n/10%10)
{
sum++;
return sum;
}
return sum;
}
答案 0 :(得分:2)
当return
语句返回值时,该值由表达式指定。该表达式可以是一个简单的表达式,例如常量或变量名称,但它不需要。它可以是任何适当类型的有效表达式。
有人可以解释“+1”的值存储在内存中的位置,
这取决于编译器,但添加1可能的结果不是存储在系统内存中。更有可能的是,它永远不会离开CPU。
为什么我不应该创建一个存储摘要的变量?
将结果存储在变量中,然后使用变量的名称作为return
表达式,没有任何内在错误。在某些情况下可能会更清楚。但即便如此,该值实际上可能不会存储到系统内存中。但是,如果将 存储到系统内存中,那么这将耗费更多时间。
这里要理解的关键是return
语句指定值直接返回,而不是间接返回。在大多数情况下,对于大多数编译器而言,这样的返回值通过CPU寄存器而不是系统存储器传递给调用者,尤其包括您熟悉的情况。
答案 1 :(得分:1)
return
语句采用表达式并将其用作函数的返回值。
表达式可以是单个变量,调用函数的返回值,文字值或上述任意组合与任意数量的运算符组合在一起。
无需在变量中存储表达式,只将该变量传递给return
。任何正确类型的表达都可以放在那里。
答案 2 :(得分:-1)
返回值取决于调用约定。在x86中,它们通常放在寄存器EAX中(如果需要更多空间,则放在EDX中)。编译器不需要一个名为的显式变量 - 最终将这些变量分解为内存地址和寄存器,在这种情况下(再次依赖于您的调用约定),数学在一些寄存器中完成,结果放在EAX中在弹出callstack时使用。