2011-07-08 8 views
5

可能性の重複:私は次のコードを使用してコードに出くわした
confused about printf() that contains prefix and postfix operators.printfでスタックを使用していますか?

int main() { 
    int c = 100; 
    printf("\n %d \t %d \n", c, c++); 
    return 0; 
} 

は、私は100 & 101になるように出力を期待しますが、私は出力を得ますas

101  100 

なぜ誰かが私に助けてくれますか?保証はありませんので、最初のC++を右から左へ

+0

コードはprintfのパラメータを逆順に評価しているので、 "C++"パラメータのcが最初に挿入され、次に前のcパラメータが挿入されています。 2番目の値に1を加えてCを増やしたい場合は、printf( "\ n%d \ t%d \ n"、c、c + 1)を使う必要があります。 C++; –

答えて

-3

printfの作品が実行される(C = 100)、次いで後にC++実行及びC = 101 したがって、101と100が出力 http://en.wikipedia.org/wiki/Printf

+2

-1。これは間違っています。未定義のビヘイビアを呼び出す結果がどのようなものであるかは期待できません。 –

+0

そのundefinef http://en.wikipedia.org/wiki/Printf wiki atleastを読む..デフォルトではprintfは右揃え – ashmish2

+2

@ ashmish2:あなたはprintfがその引数をどのように処理するのか、そして引数がどのように "準備されている"彼らがprintfに渡される前に、コールサイトで。その2番目の部分(関数呼び出しにおける引数の評価の順番)は、標準によって規定されていません。 – Mat

5

左側にcか、または右側のc++が最初に評価されます。

関数パラメータの評価の順序は、標準どおりUnspecifeidひいては未定義の動作あります。

「特定の他の態様および抽象機械の動作がunspecifiedfor example, order of evaluation of arguments to a function)としてこの規格に記載されている可能、この規格:セクションC++標準の1.9当たりとして

許容される動作のセットを定義します。これらは、抽象マシンの非決定的な側面を定義します。

+0

あなたの質問には大胆な "不特定の行動"があります。しかし、それはあまり有用ではありません。その結果、その振る舞いは未定義です。だから、あなたは少なくとももっと大胆な "未定義の振る舞い"を持っているべきです。 –

9

CおよびC++標準では、関数パラメータの評価順序が保証されていません。ほとんどのコンパイラは、cdecl呼び出し規約を使用してスタックにプッシュされる順序であるため、右から左へパラメータを評価します。

+0

男! が定義されていない場合、これらの「なぜ私のプログラムはを実行するのですか」という質問に答えてすぐに立ち往生しなければなりません。 –

+0

http://en.wikipedia.org/wiki/Printfこれは未定義ではありません – ashmish2

+0

@ ashmish2:David Hammensコメントの ''は 'printf'(明確に定義された関数です)ではなく' c、C++ '議論。それは未定義です。このトピックの前のQを参照してください。http://stackoverflow.com/questions/3109475/confused-about-printf-that-c​​ontains-prefix-and-postfix-operators – MSalters

1

ちょうどprintf ("%d\n", c++)またはprintf ("%d\n", c)を使用した場合は、いずれの場合も100となります。 1つの関数呼び出しでcとC++の両方を印刷すると、の定義されていない動作になります。

関連する問題