2016-11-15 20 views
3

私はC言語を学んでいますが、これまでのところ言語をよく理解しており、最近は単なるリンクリストを実装しました。私は、Linus Torvalds氏とテッド会談を見ていた、彼は悪いコード対良いコードを言及し、リンクリストからエントリを削除するこれらの2つの例を提供した:C-効率的なコードと良いコードとの比較

/*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; 
} 

良いコードの彼の例があるように私には思えます効率的ですが、私はこれを自分で考え出していないでしょう。私が従うことができるCでのプログラミング中に良い練習のための推奨はありますか?また、彼の例のようにポインターを操作する方法もありますか? C.のプログラミング中に避けるべき悪い習慣や習慣と同様、これはあまりにも広い質問ではないと思っています。

+0

これは広すぎる質問です。はっきりと答えられる質問をしてください。 – user694733

+0

広すぎるかどうかわかりませんが、コードレビューコミュニティでより良い回答を見つけ出す必要があります。 –

+0

おそらくそれは広すぎます。ベストプラクティスに関するよく見直された書籍を入手し、有用なイディオムを拾うためによく理解されたコードを読んでください。あなたが批判的な目で書いたものを見るために戻って、最終的には... – Useless

答えて

2

Linusの特定の例は、間接を使ってブランチを避ける方法を示しています。 head = entry->nextprev->next = entry->nextで表される2つの別々のコードパスは、*indirect = entry->nextに割り当てられているものへのポインタを使用することで1つにまとめることができます。

このアプローチでは、よりエレガントで直線的なコードに分岐数を減らすことができます。

一般的なパターンは、あなたがこのコードを回すことができるということです。

int a = 0, b = 0; 

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

/* continue working with "a" and "b" */ 

中に、:

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; 
} 
+0

ありがとう、それはなぜ彼がそのようなコードを書いたのか私の質問の一部に答える。 – octain

+0

分岐とコードパスだけでなく、保守が必要な(一時)変数の量もあります。 – joop

4

私の短い答えは間違っていませんが、どちらもLinusです。私はCで多くの仕事を経験している経験豊富なプログラマーであり、このリンクされたリストコードのバージョンは基本的に判読できません。私はこのコードを自分で書くつもりはない。

この例では、OKとnot-OKの両方を表示するのではなく、問題の考え方がよりコンパクトで、エッジケース(条件付きフロー)を考慮して解決する可能性があることを示しました。テスト。その得点では、彼は改善です。

"可読性"は、現代のプログラミングでは第一次の検討事項として引用されているため、あなたと他の人の両方が達成しようとしているコードを迅速に理解することができます。これは、複雑さとパフォーマンスの面で問題がありますが、そのトレードオフはあなた次第です。

+0

私は、最初のバージョンはエラーが発生しやすく、判読不能であると思います。 Javaのように見えます... – joop

+0

@joop:十分に公正なので、この問題に近づくときには異なるトレードオフをします。 –

+0

ソフトウェアエンジニアリングに関するこの質問をクロスポストするための提案を編集しました。それは良いフィットではありません。人々が質問をクロスポストすることを提案しないようにしてください。特に、投票したり、閉じたり、削除したりするときは、他のサイトで質問してください。 –

関連する問題