サーチ…


プリインクリメント/ポストインクリメント/デクリメント演算子

Cでは、非常に一般的な混乱の原因である「++」と「 - 」の2つの単項演算子があります。演算子は++ インクリメント演算子と演算子と呼ばれている-- デクリメント演算子と呼ばれています。どちらも接頭辞形式または接尾 形式で使用できます。 ++演算子の接頭辞形式の構文は++operandあり、接尾辞形式の構文はoperand++です。接頭辞形式で使用される場合、オペランドは最初に1インクリメントされ、結果のオペランドの値は式の評価に使用されます。次の例を考えてみましょう。

int n, x = 5;
n = ++x; /* x is incremented  by 1(x=6), and result is assigned to n(6) */
         /* this is a short form for two statements: */
         /* x = x + 1; */ 
         /* n = x ; */

後置式で使用すると、式の中でオペランドの現在の値が使用され、オペランドの値が1インクリメントされます。次の例を考えてみましょう。

int n, x = 5;
n = x++; /* value of x(5) is assigned first to n(5), and then x is incremented by 1; x(6) */
         /* this is a short form for two statements: */
         /* n = x; */
         /* x = x + 1; */

デクリメント演算の作業は、 --同様に理解することができます。

次のコードは、それぞれが何をしているかを示しています

    int main()
    {
        int a, b, x = 42;
        a = ++x; /* a and x are 43 */
        b = x++; /* b is 43, x is 44 */
        a = x--; /* a is is 44, x is 43 */
        b = --x; /* b and x are 42 */
        
        return 0;
    }

その上からポストオペレータは変数の現在の値を返し、 それを修正するが、予めオペレータが変数を変更し、変更された値を返すことは明らかです。

Cのすべてのバージョンでは、前と後の演算子の評価順序は定義されていないため、次のコードは予期しない出力を返す可能性があります。

    int main()
    {
        int a, x = 42;
        a = x++ + x; /* wrong */
        a = x + x; /* right */
        ++x;

        int ar[10];
        x = 0;
        ar[x] = x++; /* wrong */
        ar[x++] = x; /* wrong */
        ar[x] = x; /* right */
        ++x;
        return 0;
    }

文の中で単独で使用される場合は、プレオーバ演算子を使用することも良い方法です。上記のコードを見てください。

また、関数が呼び出されると、関数の実行前に引数のすべての副作用が発生する必要があることにも注意してください。

    int foo(int x)
    {
        return x;
    }

    int main()
    {
        int a = 42;
        int b = foo(a++);  /* This returns 43, even if it seems like it should return 42 */
        return 0;
    }


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow