在c中将函数声明为变量

远足

我目前正在我的大学复习考试,遇到了一些关于链表的令人费解的代码示例。在 Steven S. Skiena 的《算法设计手册》一书中,他使用了一些我不太了解的有趣语法。

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() 和 predcessor_list() 函数而不是显式调用它们是否有特定的优势或理由?我假设它与维护指针有关,但我找不到任何关于此的参考资料。

三聚氰胺

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

  1. 他们缺乏原型:

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

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

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

  2. 它们在一个函数内。

    在块内声明函数是没有意义的。这不会使函数本地化;在标准 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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在C中将函数参数声明为const

如何在Kotlin中将函数声明为变量

有什么方法可以在perl中将函数声明为变量?

如何在flutter(dart)中将异步函数声明为变量?

在CPP类中将C函数声明为好友

在Typings声明中将函数声明为参数

C ++:使用auto将类声明为函数内的变量

在C中“声明为函数”

在原型中添加函数,而不是在OOP Javascript中将其声明为变量

直接使用函数或将其声明为变量

Golang测试声明为变量的函数(testify)

变量或字段(函数)声明为无效

在SwiftUI中将视图声明为View主体内的变量时,出现“函数声明不透明的返回类型[...]”错误

混合Swift和C:如何在最简单的方法中将C函数声明为参数

可以在Java中将实例变量声明为静态变量

您可以在C语言中的main中将变量声明为结构吗?

为什么在C#8.0中将局部函数声明为static

在“数据”部分中将变量声明为$ root的别名不是被动的

在 foreach 循环中将变量声明为 i vs &i

在类中将数组的容量声明为它自己的变量的好处?

C ++模板函数错误:变量或字段“ swapAdjacent”声明为无效

在Bash函数上进行数学运算并在1行中将其声明为变量

如何在 Maplesoft 中将通用变量声明为时间的函数,以便可以应用链规则?

如何在Python中将数组声明为函数参数?

如何在TypeScript中将函数类型声明为参数

从RxJS subscription()函数声明为组件的访问变量

通过宏将变量声明为内联函数

JavaScript-将函数声明为变量是否明智?

FFI函数可以修改未声明为可变的变量吗?