C Primer Plus(第五版)中文版的问题

来源:互联网 发布:牛鼻子软件专业版 编辑:程序博客网 时间:2024/05/22 14:14

第17章 高级数据表示

17.3抽象数据类型(ADT)

494页,中间段落

“现在,还是让我们使用List类型的第一种定义。重要的一点是要考虑清楚如下声明:

Listmovies;

是在建立一个列表,而不是在建立一个指向节点的指针或是建立一个结构。”

英文版第5版原文为

For now, let's stick to the first definition of aList type. The important point is that you should think of the declaration

List movies;

as establishing a list, not asestablishing a pointer to a node or as establishing a structure.

    中文版把think of 翻译为“考虑清楚”。如果不看上下文,把think of翻译为“考虑”,也能说得过去,(但“清楚”这个表达,英文原文中根本没有,是中文版凭空加上去的)

    然而,think of翻译为“考虑”对吗?这关系到对List movies的理解问题。这句话没有完,后面的“List movies”“as establishing a list……”都属于它,是一个整体。那么此句话结构就是think of…as…,意思是把…当做是或看成是…,所以,正确的翻译是:“重点在于你应当把List movies当做是在建立一个列表,而不是建立一个指向node的指针或是建立一个结构”。

    “当做是”并不代表事实,只是我们这样去看待这个东西(List movies)。而中文版的翻译,“考虑清楚……是在建立……”,已经把“List movies”这句话,理解为“建立一个列表”的事实。

    事实是:List movies是在建立一个指向struct node的指针变量——movies。英文原版是让读者把它(List movies这句话)看成是在建立一个列表,但事实上(List movies这句话)不是在建立列表,它是在建立指向node的指针。

 

这有什么影响?

    从上面的分析看出,中文作者对英文原文的理解有误(有关movies变量到底是什么)。因此,接下来他就会犯错。先看函数原型,

    495页,程序清单17.3 list.h

void InitializeList(List * plist)

bool ListIsEmpty(const List * plist)

bool ListIsFull(const List * plist)

unsigned int ListItemCount(const List *plist);

bool AddItem(Item item, List * plist);

void Traverse (const List *plist, void (*pfun)(Item item) );

void EmptyTheList(List * plist);

    根据list.h中的函数原型,函数InitializeList()和ListIsFull()、ListIsEmpty()以及Traverse()的参数应该是一样的,都是指向List的指针,即指向node的指针的指针。

    497页,程序清单17.4films3.c

    而在flims3.c的main()中,使用这些函数时,却出现诡异的现象,InitializeList()的参数是指向List 的指针&movies,而ListIsFull(),ListIsEmpty()、Traverse()的参数却成了List变量movies。明明在头文件list.h中,这些函数原型的参数都一样,到filmes3.c这里却不一样了。

……

InitializeList(&movies);

if (ListIsFull(movies))

……

If(ListIsEmpty(movies))

……

Traverse(movies,showmovies)

……

 

对此,中文版为了自圆其说,在501页第二段最后部分,加入一句话(黄色部分),如下,

“    ListIsEmpty()函数将……而且,如果要扩展接口以包含删除项目的操作,就需要确保当列表的最后一项被删除后,删除函数将列表重置为空列表。因为这个函数不能改变列表,不需要传递指针参数,所以参数的类型是List而不是指向List的指针

      对于链表而言,列表的大小……”。

英文原文如下,

“  The ListIsEmpty() function is quite simple, but it does depend on the list variable being set to NULL when the list is empty. Therefore, it's important to initialize a list before first using the ListIsEmpty()function.Also, if you were to extend the interface to include deleting items, you should make sure the deletion function resets the list to empty when the last item is deleted.

     With a linked list, the size of the list is limited by the amount of memory available. The ListIsFull() function tries to allocate enough space for a new item. If it fails, the list is full. If it succeeds, it has to free the memory it just allocated so that it is available for areal item.

    灰色部分是中英文的对照,黄色部分,是中文版凭空多出来的一句话。在英文原版第5版、第6版中都找不到出处。

    这种解释,完全是胡诌。函数原型的参数是指向List的指针,而在使用函数的过程中,参数却改成List变量。首先,程序上肯定不能通过编译;其次,虽然ListIsEmpty()ListIsFull()这两个函数,根据其定义,并不用接收任何参数(因为这两个函数的参数不起作用,我们可以把参数改成任何变量、指针,前提是这两个函数的参数要与list.h各自函数原型的参数对应起来)但是,为了和其他函数(如InitializeList等)保持形式上的一致,也应该以List指针做参数,而不是以List变量做参数。

 

英文原版中的错误:

    

0 0
原创粉丝点击