fgetc和getc的区别

wh62592855 2009-04-04 12:51:06
书上是这么写得:
区别在于调用getc函数时所用的参数fp不能是有副作用的表达式,而fgetc函数则可以,也就是说,getc可以被当作宏来调用,而fgetc只能作为函数来调用。
因此,调用getc比调用fgetc耗费的时间少。

int getc(FILE *fp)
int fgetc(FILE *fp)

有两个地方不理解。一个是什么叫做有副作用的表达式? 另外一个就是getc怎么被当作宏来调用?
最好有个小例子,谢谢
...全文
897 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
ltc_mouse 2009-04-04
  • 打赏
  • 举报
回复
我的意思是,代码中写的时候只是++一次,但用宏的话,实际可能不止一次;因而,在使用宏的时候,尽量不用这种“有副作用”的表达式


int i=2;
int a,b;
a=MACRO_SQRT(++i); //代码看起来只是让i自加一次,但由于宏的原因,实际可能不止,因而用宏一般不要使用有“副作用”的表达式
cout << "a=" << a <<" i="<< i << endl;
i=2;
b=func_sqrt(++i);
cout << "b=" << b <<" i="<< i << endl;
wh28556259 2009-04-04
  • 打赏
  • 举报
回复
浮起来!!!
wh62592855 2009-04-04
  • 打赏
  • 举报
回复
??
wh62592855 2009-04-04
  • 打赏
  • 举报
回复
谢谢 我明白了
我把你那个例子运行了一下
int i=2;
int a,b;
a=MACRO_SQRT(++i);
b=func_sqrt(++i);
cout<<a<<endl<<b;

a=16
b=25

可为什么呢?是不是因为执行a=MACRO_SQRT(++i); 这句时对++i只是进行简单的宏替换而不进行i的自加运算,只在计算时自加两次,i=4
而执行b=func_sqrt(++i);时i自加一次,到函数体里再自加两次,所以i=5
ltc_mouse 2009-04-04
  • 打赏
  • 举报
回复
有副作用的表达式,指的是表达式执行后,会改变表达式中某些变量的值
最简单的如++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)将是不同的~

查了下getc,在stdio.h中有宏定义的版本,而fgetc是函数~
wh62592855 2009-04-04
  • 打赏
  • 举报
回复
呵呵 谢谢你的回答
不过好像并没有解决我的问题哦
  • 打赏
  • 举报
回复
另外一个就是getc怎么被当作宏来调用?

它本身是宏,不是说你要把他当作宏调用,你只要调用他,就是在调用宏。
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20080513/21/c4fe0a8e-eef1-4777-92e8-80c1998c1a9a.html

转:(
所以fgetc是一个函数
getc是一个宏
一般来说宏产生较大的代码,但是避免了函数调用的堆栈操作,所以速度会比较快。
但是也有例外的情况:
1. 很多RISC处理器(如SUN SPARC)使用寄存器窗口重叠技术,
(http://server.chinabyte.com/404/157904_1.shtml),
在寄存器充足的情况下,根本不需要堆栈操作,fgetc函数比getc宏更快
2. 在多线程的情况下,为了线程同步,getc和fgetc可能是相同的。

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧