当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 3 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : 请帮忙解释这评论:更节省空间和时间的isupper函数
帖子发表于 : 2008-08-11 21:57 
头像

注册: 2006-09-02 18:58
帖子: 474
地址: 深圳
送出感谢: 0 次
接收感谢: 0 次
K&R的练习7-9,page 148,答案解释到:
引用:
"The C Programming Language", 2nd edition, Kernighan and Ritchie
Answer to Exercise 7-9, page 168
Solution by Gregory Pietsch
Functions like isupper can be implemented to save space or to save time. Explore both possibilities.

This question is best left to an essay rather than code, so here's my take: The easiest way to implement the eleven is() functions in C90's version of <ctype.h> is via a table lookup. If UCHAR_MAX is 255, then a table would take up around 514 8-bit bytes and still have room for five more is() functions. In modern programs, this is a miniscule expense of both space and time since a mere table lookup doesn't cost a whole lot (although space may be a priority for embedded systems). Additionally, since the is() functions of <ctype.h> are locale-dependent and therefore subject to locale-specific whims, a table could more easily be modified than modifying hard calculations. Consider the following three implementations of isupper() : Implementation #1:

int isupper(int c)
{
return (c >= 'A' && c <= 'Z');
}

Implementation #2:

int isupper(int c)
{
return (strchr("ABCDEFGHIJKLMNOPQRSTUVWXYZ", c) != NULL);
}

Implementation #3:

/* Presumably, _UP is a power of 2 and
* _Ctype is a table
*/

int isupper(int c)
{
return ((_Ctype[(unsigned char)c] & _UP) != 0);
}

Implementation #1 fails in EBCDIC and implementation #2 fails in a locale that adds more upperspace characters than the ones mentioned. Implementation #3, however, suggests that _Ctype[] can be modified to accommodate new uppercase characters.

我翻译一下,你们看下我理解有没有问题:
引用:
这个问题最好是论说而非编码。所以这是我的:实现C90版<ctype.h> 里的is()函数 是通过查看一张表来实现的。如果UCHAR_MAX是255,那么一张表将占用大约514 8-bit字节而且还有供5个is()函数占用的剩余空间.对于现代的程序,这是消耗时间和空间最小的,因为字节表的查找不会花费太多的空间(虽然空间对嵌入式系统来说可能要优先(更重要))。另外因为<ctype.h>里的is()函数是(locale-dependent)场所(我理解为不同计算机)依赖,所以受限于(locale-specific)场所的特殊设定,表将比修改硬件的计算更容易。考虑以下三中isupper()的实现方式
......

实现方式#1 失败于 “扩充的二进制编码的十进制交换码”(EBCDIC);
#2失败于 会比#1增加更多的 大写英文字符的空间(upperspace) 的一个场所;
#3 然而,建议_Ctype[]能修改成容纳新的大写字符

说说那结论吧,谢谢


_________________
------
ThinkPad·R60i-0657LN1
Ubuntu 8.04 . Hardy Heron+XP
------


页首
 用户资料  
 
2 楼 
 文章标题 :
帖子发表于 : 2008-08-11 22:21 

注册: 2006-09-11 22:47
帖子: 2841
送出感谢: 0 次
接收感谢: 4
楼主你想表达什么问题?

方案3就是标准库的实现方式,它在时间方面是最优的。

空间最优的方式是方案1。

至于方案2,基本上就是脑残,时间和空间都不是最优的。

如果楼主是要练习英语,我给你几个提示:

“locale”的意思指的是不同的语言环境,也就是说ASCII语系使用A-Z,但是一个其他的语言并非使用A-Z这26个字符,例如希腊字母就会是以欧米加结尾。
“suggest”此处的意思是“暗示着”,而不是“建议”
“lookup”的意思是“查找”,不是“查看”。


页首
 用户资料  
 
3 楼 
 文章标题 :
帖子发表于 : 2008-08-12 12:51 
头像

注册: 2006-09-02 18:58
帖子: 474
地址: 深圳
送出感谢: 0 次
接收感谢: 0 次
:em06 噢噢,非常感谢.
也非常抱歉.没表达清楚. :D


_________________
------
ThinkPad·R60i-0657LN1
Ubuntu 8.04 . Hardy Heron+XP
------


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 3 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 3 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译