C-高效代码与良好代码

oct*_*ain 5 c pointers linked-list

我正在学习C语言,到目前为止对语言有了很好的理解,我最近实现了一个非常简单的单链表.我曾与Linus Torvalds一起观看过Ted演讲,他提到了良好的代码与糟糕的代码,并提供了从链接列表中删除条目的两个示例:

/*bad code*/
remove_list_entry(entry){
    prev = NULL;
    walk = head;

    while(walk != entry){
        prev = walk;
        walk = walk->next;
    }

    if(!prev)
         head = entry->next;
    else
         prev->next = entry->next;


/*good code*/
remove_list_entry(entry){
    indirect = &head;

    while ((*indirect) != entry)
        indirect = &(*indirect)->next;

    *indirect = entry->next;
}
Run Code Online (Sandbox Code Playgroud)

在我看来,他的良好代码示例是有效的,但我自己也不会想到这一点.在使用C编程时,我可以遵循哪些良好实践建议?或者像他在他的例子中那样操纵指针的某些方法?除了在CI编程时要避免的坏习惯和做法,希望这不是一个太宽泛的问题.

Ben*_*tto 6

这是我的简短回答:你没错,但Linus也不错.我是一名经验丰富的程序员,在C语言方面有很多工作,我发现他的链接列表代码版本基本上不可读.我自己永远不会写这个代码.

他使用这个例子并不是为了表明好与不好,而是为了证明对问题的更清晰的思考可以导致更紧凑的解决方案以及更少的边缘情况(和条件流)来考虑和测试.在那个分数上,他是一个进步.

"可读性"通常被认为是现代编程中的一阶考虑因素,因此您和其他人都可以快速理解代码试图实现的目标.这是针对复杂性和性能考虑因素进行的,但需要权衡利弊.


Bla*_*iev 3

Linus 的特定示例演示了如何通过使用间接来避免分支。head = entry->next由和表示的两个独立的代码路径prev->next = entry->next可以通过使用指向正在分配给的事物的指针来合并为一个:*indirect = entry->next

这种方法可以产生非常优雅的、分支更少的线性代码。

一般模式是您可以将此代码转换为:

int a = 0, b = 0;

if (some_condition) {
    a = 1;
} else if (other_condition) {
    b = 1;
}

/* continue working with "a" and "b" */
Run Code Online (Sandbox Code Playgroud)

进入:

int a = 0, b = 0;
int *p;

if (some_condition) {
    p = &a;
} else if (other_condition) {
    p = &b;
} else {
    p = NULL;
}

/* consequently, work only with "*p" and never again touch "a" or "b" */
if (p) {
    *p = 1;
}
Run Code Online (Sandbox Code Playgroud)