2014-01-17 14 views
7

タイトルは少し曖昧ですが、この質問の定義方法はわかりません。このCステートメントの順序は明確に定義されていますか?

それは、次のコードに関係しています:

for (match   = root, 
    m_matchBase = match->requestedBase, 
    m_matchLength = match->length; 

    match != NULL; 

    match   = match->next, 
    m_matchBase = match->requestedBase, 
    m_matchLength = match->length) 
{ 
    if (m_matchBase <= m_base && m_matchBase + m_matchLength > m_base) 
     break; 
    // other stuff... 
} 

を順次実行することを保証forループ内の文はありますか?

たとえば、match = match->nextの後に実行すると、m_matchBase = match->requestedBaseが保証されますか?

+1

はい、それは保証されています、[その他の情報](http://stackoverflow.com/questions/54142/how-does-the-comma-operator-work) –

+0

http://stackoverflow.com/questions/52550/what -does-the-operator-do-in-c#52558 – clcto

+0

これはCかC++ですか?一つを選ぶ。タイトルに「C」としか書かれていないので、今はあなたが言ったことを意味すると思っています。あなたのタグを適切に編集します。 –

答えて

8

はい、コンマ演算子(ここで使用されているもの)は操作を順序付けします。これは、match->nextがnullになると、ループがクラッシュする可能性が高いことを意味します。

+2

クラッシュでいいキャッチ – bolov

+0

いいキャッチ!ありがとう –

2

はい。

カンマ演算子の左のオペランドは、空白の式として評価されます。その評価と右オペランドとの間には、 シーケンスポイントがあります。次に、右側の オペランドが評価されます。結果は型と値を持ちます。

&&オペレータにもシーケンスポイントがあります。

3

はい、参照C++ 11標準(5.18):カンマで区切られた式の組は、左から右に評価され

。左の式はdiscarded- 値式

5

式で左から右に評価され、各評価の後シーケンス点が存在するであろう。 Cでは文法の文ためC99標準セクションから宣言なし6.8.5繰り返し文は次のとおりです。(表現オプトため

;表現オプト、表現 opt)statement

したがって、0123各式のは、セパレータとは対照的にcomma operatorになります。つまり、割り当ては左から右に評価されます。これは、セクションで説明されて6.5.17カンマ言うオペレータ

カンマ演算子の左オペランドがvoid式として評価されます。その評価の後に シーケンスポイントがあります。次に、右側のオペランドが評価されます。その結果、これは、保守コードは別の問題であるかどうか、その型と値

を持っている、それは注意することが重要であるmatch>nextリターンはあなたが次のサブ式でundefined behaviorを起動しますNULLとき。これは、現在のフォームを見逃し易く、チェックするのが難しいため、これを実証する方法はおそらくスタイルの貧弱な選択です。

関連する問題