0

重複の可能性:
これらの未定義の動作を誰かが説明できますか(i = i ++ + ++ i、i = i ++など…)

#include<stdio.h>
void main()
{
int a=5;
printf("%d\t%d\t%d\n",a,a++,++a);
}

gccバージョン4.4.3(Ubuntu 4.4.3-4ubuntu5)で767を示す上記のプログラムの出力。7 6 6の代わりに表示されているのはなぜですか?

4

3 に答える 3

4

プログラムは好きなものを何でも表示でき、出力は正しいです。

動作は未定義です。何でも起こります。

未定義とは何ですか?

  • a引数リストで2回インクリメントしてprintf()

の動作void main()は、せいぜい実装定義です。の戻りタイプは。であるmain()必要がありますint


ISO / IEC 9899:2011(C 2011)規格

§6.5式

¶2スカラーオブジェクトの副作用が、同じスカラーオブジェクトの異なる副作用、または同じスカラーオブジェクトの値を使用した値の計算のいずれかに対してシーケンスされていない場合、動作は定義されていません。式の部分式に許容される順序が複数ある場合、そのような順序付けられていない副作用がいずれかの順序で発生した場合の動作は定義されていません。84)

84)この段落は、次のような未定義のステートメント式をレンダリングします

    i = ++i + 1;
    a[i++] = i;

許可しながら

    i = i + 1;
    a[i] = i;
于 2012-06-29T18:24:15.507 に答える
1

Cでundefinedの1つのステートメントで同じ変数を複数回変更する。結果は予測不可能であり、コンパイラ間で非常に異なる可能性があるため、これは避ける必要があります。

于 2012-06-29T18:26:07.807 に答える
-1

「a++」と「++a」の違いの簡単な説明は次のとおりです。

「a++」では、増分は操作に行われず、「++a」は操作の前に行われます。

例えば:

a = 0; print("%d ", a++); printf("%d ",a);あなたに与えるだろう0 1

a = 0; print("%d ", ++a); printf("%d ",a);あなたに与えるだろう1 1

于 2012-06-29T18:25:38.503 に答える