-3

式が評価された後、または文全体が評価された後に後置インクリメント/デクリメント演算子が評価されますか?Postfix増分演算子の評価

#include<stdio.h> 

void main() 
{ 
    int a=0; 
    int b=0; 

    printf("%d %d",a||b,b++); // Output is 1 0 

} 

マイコンパイラは、printf引数を右から左に評価します。式a || bの答えは1です。これは、|| bが評価される前にbがインクリメントされたことを意味します(つまり、b ++は式b ++を評価した直後にインクリメントされます)。

ここでは、Incrementing in C++ - When to use x++ or ++x?は、文全体の後に評価されます。

どちらが正しいですか?

+6

どちらも正しくありません。この動作は未定義です。https://stackoverflow.com/questions/949433/why-are-these-constructs-using-undefined-behavior – interjay

+0

を参照してください。そう多くのupvotesを受け取った答えは間違っていますか? –

+0

@interjay一般に、変数が同じステートメントで繰り返されない場合の動作は何ですか? postfixは、式を評価した後、または文全体を評価した後に変数の値をインクリメントしますか? –

答えて

6

関数の引数の評価順序は不定です。引数の評価に関連するすべての副作用は、コントロールが呼び出された関数に渡される前に適用されます。 C標準(6.5.2.2関数呼び出し)から

10シーケンスポイントは、機能 指名の評価と実引数の後に実際の呼び出しの前にあります。ここで

は実証プログラムにある

#include <stdio.h> 

struct 
{ 
    int x; 
} a = { 0 }; 

void f(int x) 
{ 
    printf("x = %d\n", x); 
    printf("a.x = %d\n", a.x); 
} 

int main(void) 
{ 
    f(a.x++); 
} 

その出力は、1つの引数は、他の引数との副作用に依存しているため、この呼び出しで副作用に

x = 0 
a.x = 1 

ですその副作用の評価は、引数に関して不確定に配列された。

printf("%d %d",a||b,b++); 

プログラムに未定義の動作があります。

オペランドの評価の間に副作用がシーケンスされるとき、Cには4つの演算子があります。論理AND演算子(& &)、論理OR演算子(||)、コンマ演算子(、)、および条件演算子(?)です。例えば

#include <stdio.h> 

int main(void) 
{ 
    int x = 0; 

    printf("x = %d\n", x++ == 0 ? x : x - 1); 
} 

プログラム出力は

x = 1 
x++

発現の評価の副作用は評価の前に発現後xを配列決定したのですか?符号。

+0

"aschepler"(答えの下)は、 "f(x ++);では、fを呼び出す前にインクリメントが起こると言っています。だからあなたの例では、fを呼び出す前にインクリメントが起こるはずですか? –

+0

@SagarPインクリメントは、引数x ++(その値がインクリメントする前のオペランドの値)の評価後、関数の本体が実行される前に呼び出された関数に制御が渡される前に行われます。 –

+0

シーケンスポイントの前には、まだ古い値が残っていますが、シーケンスポイントに達した後に新しい値が使用可能になります。これは他の変数で使用できますか? –

0

あなたがリンクした質問の一番最初の回答は不正確です。 x++のインクリメントは、式の値を決定した後、時には含まれている式を評価する前に行われることが保証されていますが、発生時に他の保証はありません。

特に、同じ関数呼び出しに対する引数の副作用が不確定にシーケンスされているため、そのプログラムの動作は未定義です。

+0

一般に、変数が同じステートメントで繰り返されない場合の動作は何ですか? postfixは、式を評価した後、または文全体を評価した後に変数の値をインクリメントしますか? –

+0

@SagarPそれは異なります。 'f(x ++);'では、インクリメントは 'f'を呼び出す前に起こります。 'g()+ x ++'では、インクリメントが 'g()'の呼び出しの前か後に起こるかについて保証されていません。 – aschepler

+0

f(x--)では、fを呼び出す前にxが実際に減分されますか?私はまだf(n--)を呼び出したことを覚えています.nの値がまったく減っていないため、コードは無限回帰に入りました。 –

関連する問題