2016-08-26 10 views
0

私は、複数の式が右から左に評価されることを知っています。 例:C言語のprintf内の式の評価

int i = 0; 
printf("%d %d %d", i, i++, i++); // Prints 2 1 0 

しかし、それが評価されるようにそれぞれの式に来るとき、それは右から左へ、またはその逆からであれば、私は届きません。左から右への評価を考慮

int main() 
{ 
    int a = 1, b = 1, d = 1; 
    printf("%d", a + ++a); // Result = 4 
} 

は、上記のコードは、1 + 2 = 3

int main() 
{ 
    int a = 1, b = 1, d = 1; 
    printf("%d", ++a + a); // Result = 4 
} 

として評価されるべきであり、これは、評価すべき2 + 2 = 4

しかし、両方のよう答えが4の場合。

誰でもこれらの式の評価方法を説明できますか?

+1

_私は、複数の式が右から左に評価されることを知っています。例:_ 'int i = 0; printf( "%d%d%d"、i、i ++、i ++); // Prints 2 1 0':**間違った**は未定義の動作です。 –

+0

@AlterMannこの質問には2つの問題があります:関数の引数の評価の順序と、同じ式の同じ変数の操作の順序が間違っています。その複製は後者を説明するだけで、私はこれを再オープンします。 – Lundin

+1

@ Lundinしたがって、あなたはそれを間違って再オープンしました。複製は実際に注文を説明します:http://stackoverflow.com/a/18260171/4082723、http://stackoverflow.com/a/949508/4082723 – 2501

答えて

2

私は、複数の式が右から左に評価されることを知っています。

いいえ。機能パラメータの評価の順序は、不特定の動作です。あなたはを意味することはできませんは、システムからシステムに、または関数呼び出しから関数呼び出しにさえも異なることがあります。この評価の順序に依存するプログラムを書くべきではありません。

さらに、関数パラメータの評価の間にシーケンスポイントがないため、printf("%d", ++a + a);のようなコードも、未定義の動作を呼び出します。Why are these constructs (using ++) undefined behavior?を参照してください。

演算子の優先順位と演算子の関連付けは、式が解析される順序のみを保証します。これは、オペランドの評価順序とは関係ありません。 (|| && , ?:のような特別な例外を除いて)