回 帖 发 新 帖 刷新版面

主题:[讨论]C语言中关于register的问题

#include<stdio.h>
void main ()

 long fac(long);
long i,n;
scanf("%ld",&n);
for(i=1;i<=n;i++)
printf("%ld!=%ld\n",i,fac(i));
}

long fac(long n)
{
 register long i,f=a;
for(i=1;i<=n;i++)
f=f*i;
return(f);
}

就是l
ong fac(long n)
{
 register long i,f=a;
for(i=1;i<=n;i++)
f=f*i;
return(f);
}
这里我不打懂,书上说 i 和f 都是寄存器变量,那么我第一次i=1,走过了for()
f就等于1,第二次 n=2,那么还需不需要再走一次for(i=1,;i<=n;i++)?
第三次是n=3,接下来就怎么走?是直接跳过i=1,从寄存器里取出上次 i 的值 
2吗??然后直接f=f*i  ???

回复列表 (共2个回复)

沙发

寄存器变量是为了提高程序运行速度。
是怎么提高的??
这里有没有register都没关系吗??

板凳

理论上,从寄存器中读取一个值的速度要比从内存中快,这样就能提高效率。但是,现在的编译器的优化能力尽可能的使用寄存器,不一定要人工指定 register变量, 让编译器自己来优化,可能效果更好。如果要研究它的具体实现过程,可能需要了解汇编。
下面的c语言代码 和 汇编代码是等价的。

#  long fac (long n)
#  {
#      long f = 0l;
#      if (n <= 0l)
#        return f;
#      f = 1l;
#      do {
#        f *= n;
#      } while (--n > 0l);
#      return f;
#  }  

.globl _fac
_fac:
        movl  $0, %eax      # f = 0l;
        movl  4(%esp), %ecx   ### 4(%esp) 表示 n
        testl %ecx, %ecx    # if (n <= 0)
        jle   return        #   return 0l;

        movl $1, %eax       # f = 1l;

repeat:
        imul %ecx, %eax     # do      f *= n;
        loop repeat         # while (--n > 0l);

return:
        ret                 # return f;

我来回复

您尚未登录,请登录后再回复。点此登录或注册