gpt4 book ai didi

c - 在c中将函数声明为变量

转载 作者:太空宇宙 更新时间:2023-11-04 05:47:27 25 4
gpt4 key购买 nike

我目前正在大学复习考试,遇到了一些与链表有关的令人费解的代码示例。在 Steven S. Skiena 的 THE ALGORITHM DESIGN MANUAL 一书中,他使用了一些我不太理解的有趣语法。

delete_list (list **l, item_type x)
{
list *p;
list *pred;
list *search_list(), *predicessor_list();

p = seach_list(*l, x);
if (p != NULL)
{
pred = predecessor_list(*l, x);
if (pred == NULL)
*l = p-> next;
else
pred->next = p->next;

free (p);
}

}

声明 search_list() 和 predicessor_list() 函数而不是显式调用它们是否有特定优势或理由?我假设它与维护指针有关,但我找不到这方面的任何引用资料。

最佳答案

这些是函数声明。我认为它们有两点不好:

  1. 他们缺乏原型(prototype):

    list *search_list(list *, item_type), *predecessor_list(list *, item_type);

    原型(prototype)(此处为每个函数的 list *, item_type)告诉编译器函数期望的参数类型(以及参数的数量)。没有理由不在函数声明中提供该信息。

    如果你只是说 list *search_list(),编译器无法检查 search_list 的调用是否传递了正确的参数。

  2. 它们在一个函数中。

    在 block 内声明函数没有意义。这不会使函数成为本地函数;在标准 C 中,所有函数都是全局的。它只是使该声明具有局部作用域,这是相当无用的。

一个更标准的方法是

list *search_list(list *, item_type);
list *predecessor_list(list *, item_type);

void delete_list (list **l, item_type x)
{
...
}

请注意,我添加了一个 void 返回类型,因为 delete_list 不返回任何值。在 1999 年之前的 C 中,省略返回类型是允许的,但它默认为 int,而不是 void

鉴于函数原型(prototype)在 1989 年随着 ANSI C 的发布而成为标准,并且“隐式 int”在 1999 年被删除(使用 ISO 9899:1999),我会对技术内容保持警惕在算法设计手册(附有 2008 年版权声明)中。

关于c - 在c中将函数声明为变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57450544/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com