7

この質問を定義する方法がよくわからないので、タイトルは少しあいまいです。

次のコードと関係があります。

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 ループ内のステートメントは、順番に実行されることが保証されていますか?

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

4

4 に答える 4

8

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

于 2014-01-17T19:09:13.447 に答える
5

は左から右に評価され、各評価の後にシーケンス ポイントがあります。Cでは、ドラフトC99標準セクション反復ステートメントからの宣言のないfor ステートメントの文法は次のとおりです。6.8.5

for ( 式opt ; 式opt ; 式opt ) ステートメント

したがって、,式の各セットでは、単なるセパレータではなくコンマ演算子になります。つまり、代入は左から右に評価されます。6.5.17 これについては、カンマ演算子のセクションで説明されています。

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

これが保守可能なコードであるかどうかは別の問題ですが、match>next返されたときに後続のサブ式で未定義の動作NULLが呼び出されることに注意することが重要です。これはおそらく、見落としやすく、現在のフォームでチェックするのが難しいため、これがスタイルの悪い選択であることを示すのにある程度役立ちます.

于 2014-01-17T19:11:54.860 に答える
3

はい、c++11 標準 (5.18) を参照してください。

コンマで区切られた式のペアは、左から右に評価されます。左の式は破棄された値の式です

于 2014-01-17T19:10:52.427 に答える
2

はい。

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

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

于 2014-01-17T19:09:35.180 に答える