2017-02-08 2 views
1

リリースリストfuncのforループに関する質問があります。 (頭はダミーなので、解放する必要はありません)。私は理解していない:cのトリッキーなforループの理解

next = next? 

ループ内の部分。実際に何をしているのか、なぜ簡単に

next? 

で十分ではありませんか?ここでのコードは次のとおり

typedef struct NODE { 
int num; 
struct NODE* next; 
} Node; 




void release_list(Node* head) { 
    Node* next = head->next ? head->next->next : NULL; 
    for(Node* curr = head->next; 
     curr != NULL; 
     curr = next, next = next? next->next : NULL) { 
     free(curr); 
    } 
} 
+0

それは、[条件(別名三項)演算子]です(http://en.cppreference.com/w/c/language/operator_other#Conditional_operator) 。私は良い重複した質問があることを知っているが、私はちょうどそれを見つけることができません。 –

答えて

2

三項演算子。誤って最後の要素にNULL->nextを行うことを避けるためにあるコードの

if(next != NULL) 
    next = next->next; 
else 
    next = NULL; 

ポイント:

next = (next? next->next : NULL) 

または:

コードと同等です。

3

部:

curr = next, next = next? next->next : NULL 

は、それが終了するたびに実行されることを意味forループの第3の部分です。コードを達成しようとしている何

curr = next; 
if (next)     //if next != NULL 
    next = next->next; 
else 
    next = NULL; 

存在しません最後の要素、上NULL->nextにアクセスしようとしないように、すべてのポインタをチェックすることです:同等です。一般に


、以下のようなif文:this linkに示すよう

result = a > b ? x : y; 

if (a > b) { 
    result = x; 
} else { 
    result = y; 
} 

次の文のように書き換えることができます。

Ternary operator in Cについて詳しく読むことができます。

+0

それは 'next == next? 'でなければならないでしょうか?そうでなければ、それは割り当てであり、比較ではありませんか? –

+0

@arc_lupus私はそれを手に入れませんでした、あなたは 'next == next 'であるべきですか? – Marievi

+0

@ user694733からの答えは私のためにそれを解決した、誤解、申し訳ありませんでした! –

0

これは?:オペレータの一部です。構成はcond?consequent:alternativeです。 condconsequentが評価されtrue評価し、それは、値が式の結果となりそうalternativeが評価されますと、それは価値が式の結果であるなら。 consequentalternativeのタイプは同じである必要があります。

nextNULLある場合nextNULLNULLないのであればnext ? next->next : NULLnext->nextを意味します。

さらに、,演算子は、式を順番に評価することを意味します。これは、最も優先度の低い演算子で、for句の最後の部分は、最初にcurr = nextと評価され、次にnext = next ? next->next : NULLと評価されることを意味します。次のようにforループ

0

ザは、whileループのように書き換えることができる:

Node* curr = head->next; 
while(curr != NULL) 
{ 
    free(curr); 
    curr = next; 
    if (next != NULL) 
    { 
     next = next->next; 
    } 
    else 
    { 
     next = NULL; 
    } 
} 
next = next?next->next:NULL

の意図は、その次のノードにnextポインタを移動させることです。

参照:割り当て=よりも優先順位が高い?:The ternary (conditional) operator in C

0

obscuationの例で、ほとんどの場合、コードはリンクリストのすべてのノードを削除できませんでした。同じことを行うために、より速く、より読みやすい方法は次のようになります。

void release_list (Node* head) 
{ 
    while(head != NULL) 
    { 
    Node* tmp = head; 
    head = head->next; 
    free(tmp); 
    } 
}