C陷阱与缺陷的一道习题,练习5-2

沭水河畔 2008-11-29 05:06:54

#include <stdio.h>
main()
{
register int c;
while((c=getchar()!=EOF)
putchar(c);
}

程序作用:输入复制到输出
这个程序把#include去掉,导致程序不能编译,因为这时EOF是未定义的。假定我们手工定义了EOF
#define EOF -1
这个程序在许多系统中能够运行,但是在某些系统运行起来却慢的多。这是为什么?

备注:本节是讲signal(信号)的。
...全文
272 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
yangkunhenry 2008-11-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 jznhljg 的回复:]
引用 1 楼 yangkunhenry 的回复:
原因在getchar() 它是个宏
因为函数调用通常要花较长时间,所以常常把 getchar实现为宏。
这个宏定义在 stdio.h中,所以当除去 #include 时,编译器就不知道 getchar 是什么。
在有些系统上,假设 getchar 是返回一个 int的函数。
实际上,许多 C 实现在其库中都有 getchar函数,部分原因是为了防止这样的失误。
于是,在 #include 遗漏的情况下,编译器使用 getchar的函数版本。函数…
[/Quote]
我上个月看过,忘了书上到底怎么说的了。就搜了下,百度“EOF是未定义的”--第一条

宅男兄,俺不是LZ的小号。非马甲也……
jznhljg 2008-11-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 yangkunhenry 的回复:]
原因在getchar() 它是个宏
因为函数调用通常要花较长时间,所以常常把 getchar实现为宏。
这个宏定义在 stdio.h中,所以当除去 #include 时,编译器就不知道 getchar 是什么。
在有些系统上,假设 getchar 是返回一个 int的函数。
实际上,许多 C 实现在其库中都有 getchar函数,部分原因是为了防止这样的失误。
于是,在 #include 遗漏的情况下,编译器使用 getchar的函数版本。函数调用的开销使程序变慢。 putchar有同样的…
[/Quote]
我怎么听着这么熟呢?.书上原话.??..LZ的小号上来自问自答了?呵...遁..
yangkunhenry 2008-11-29
  • 打赏
  • 举报
回复
原因在getchar() 它是个宏
因为函数调用通常要花较长时间,所以常常把 getchar实现为宏。
这个宏定义在 stdio.h中,所以当除去 #include 时,编译器就不知道 getchar 是什么。
在有些系统上,假设 getchar 是返回一个 int的函数。
实际上,许多 C 实现在其库中都有 getchar函数,部分原因是为了防止这样的失误。
于是,在 #include 遗漏的情况下,编译器使用 getchar的函数版本。函数调用的开销使程序变慢。 putchar有同样的问题。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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