fgetc和getc的区别
来源:互联网 发布:好多网络歌手不红 编辑:程序博客网 时间:2024/05/17 01:09
fgetc和getc的区别
The function getchar is defined to be equivalent to getc(stdin). The difference between the first two functions is that getc can be implemented as a macro, whereas fgetc cannot be implemented as a macro. This means three things.
1.The argument to getc should not be an expression with side effects.
2.Since fgetc is guaranteed to be a function, we can take its address. This allows us to pass the address of fgetc as an argument to another function.
3.Calls to fgetc probably take longer than calls to getc, as it usually takes more time to call a function.
两个都是用来从stream中取得一个字符的,区别在于调用getc函数时所用的参数stream不能是有副作用的表达式(稍后解释),而fgetc函数则可以,也就是说,getc可以被当作宏来调用,而fgetc只能作为函数来调用。
一般来说,调用宏比调用函数耗费的时间少。
它们的原型:
- int fgetc ( FILE * stream );
- int getc(FILE * stream);
所以fgetc是一个函数
getc是一个宏
一般来说宏产生较大的代码,但是避免了函数调用的堆栈操作,所以速度会比较快。
相关资料也说明了,有例外的情况:
1. 很多RISC处理器(如SUN SPARC)使用寄存器窗口重叠技术,
(http://server.chinabyte.com/404/157904_1.shtml),
在寄存器充足的情况下,根本不需要堆栈操作,fgetc函数比getc宏更快
2. 在多线程的情况下,为了线程同步,getc和fgetc可能是相同的。
有副作用的表达式,指的是表达式执行后,会改变表达式中某些变量的值
最简单的如++i,这个表达式执行后,i的值会改变,这样的表达式是不应该在宏调用里出现的
- #define MACRO_SQRT(x) (x)*(x)
- int func_sqrt(int x)
- {
- return x * x;
- }
上面是两个计算平方的方法,一个用宏,一个用函数
int i=2;
MACRO_SQRT(++i) 与 func_sqrt(++i)将是不同的~
- int a,b;
- /* 下面的代码是正常的 */
- int i = 2;
- a = func_sqrt(++i);
- printf("a = %d, i = %d\n", a, i);
- /* 下面的代码则是不正常的
- *代码看起来只是让i自加一次,但由于宏的原因,实际可能不止,因而用宏一般不要使用有“副作用”的表达式
- * 宏会把所有的x替换成x*x,如果放入++i,那么编译器预处理的时候就会将所有的x替换成++i,可想而知会有多少个
- * ++i出现在代码里面呢?又会自加多少次呢?这显然和我们想要的不一样,看代码。
- */
- i = 2;
- b = MACRO_SQRT(++i);
- printf("a = %d, i = %d\n", b, i);
总结:fgetc和getc最大的区别在前者是函数,后者是宏,getc由fgetc通过宏实现,调用的时候注意参数stream不能是有副作用的表达式
- fgetc和getc的区别
- fgetc和getc的区别
- getc和fgetc的区别
- fgetc和getc的区别
- fgetc和getc的区别
- getc与fgetc的区别
- fgetc() 与getc()的区别
- fgetc 与 getc的区别
- fgetc和getc的区别 The function getchar is defined to be equivalent to getc(stdin). The difference betwee
- C语言中fgetc、fputc和getc、putc的区别是什么
- C语言中fgetc、fputc和getc、putc的区别是什么
- fgetc;getc
- fgetc() 与getc()有什么区别
- C语言中getch、getche、fgetc、getc、getchar、fgets、gets之间的区别
- fgetc,getc,getchar,fputc,putc和putchar函数的介绍及易犯的错误
- 5.6 getc/putc、fgetc/fputc和getchar/putchar-流的单字符读写
- gets、getc、getchar和getch的区别
- c函数---fgets,fgetc,gets,getchar,getc区别
- vim 替换命令
- 手把手教你把Vim改装成一个IDE编程环境
- realloc
- JAVA Runtime相关类学习
- C 重载
- fgetc和getc的区别
- 强制把系统缓存写入文件sync和fsync函数,, fflush和fsync的联系和区别
- socket 之 select函数
- 有关extern 头文件中包含变量
- Unix C 时间延迟函数
- 大端字节序与小端字节序
- 理解linux time命令的输出(What do ‘real’, ‘user’ and ‘sys’ mean?)
- 多播与广播
- IP划分的细节