5

:私の思考C - printf( "%d%d n"、k = 1、k = 3)の出力の説明。以下のコードの出力を説明する方法

include <stdio.h> 

int main(void) { 
    int k; 
    printf("%d %d\n",k=1,k=3); 
    return 0; 
} 

Ideone Link

1k変数に代入され、その後1が印刷されるだろうということでした。同様に3kに割り当てられ、出力は3になります。私は

int a; 
if (a = 3) { 
    ... 
} 

から推測しています

予想される出力

1 3 

実際の出力

1 1 

に等しく、
if (3) { 
    ... 
} 

どこが間違っているのか教えてください。

+0

@CinCout申し訳ありませんが、私はそれを後で気づきました。 –

答えて

7

問題は、関数の引数の評価順序が定義されておらず、評価または引数の間にシーケンスポイントがないことです。あなたが間におけるシーケンスポイントなしで複数回同じ変数を変更しようとしているように、この文

printf("%d %d\n",k=1,k=3) 

は、undefined behaviorを呼び出します。

UBを呼び出すプログラムが実行されていれば、出力があれば、それはどちらにしても正当化できません。出力は何でもかまいません。

+1

これは問題なく、1つの割り当てで 'k 'の値、つまり3を出力します。 –

+0

私はこの答えが間違っていると思いますhttp://stackoverflow.com/a/9514591/5473170。それをチェックできますか? –

+0

@SurajJainこれは最高のものではありませんが、一般的には上手く見えます。なぜそれが間違っていると思いますか? –

-4

1 1が表示されている理由は、2つの割り当てステートメントが起きているためです。制御がprintfに渡されています。

printf("%d %d\n",k=1,k=3); 

したがって、ダウン投票に応じて、これは未定義の動作です。したがって、この動作は継続してはなりません。しかし、出力が1 1であり、1 3でない理由を特定する観点から、3の割り当てが、1の後続の割り当てによって突き止められた可能性があると推測することができます。

printfが呼び出されると、コールスタックにはkという最終値を含む2つのエントリが含まれます。これは1です。

これを、実行時に何かを印刷する関数に置き換えることで、これをテストできます。

サンプルコード:

#include <stdio.h> 

int test(int n) { 
    printf("Test(%d)\n", n); 
    return n; 
} 

int main(void) { 
    int k; 
    printf("%d %d\n",k=test(1), k=test(3)); 
    return 0; 
} 

出力:

Test(3) 
Test(1) 
1 1 
+0

これは、おそらくもっと複雑な理由ではあまり説明できません。 –

+1

@ q。貧しい人は軽い言葉ですが、これは間違っています。 –

+0

私は本当に私の説明が間違っているかどうか不思議です。議論は複数の割り当てがUBであるということだけですか? – Scovetta

関連する問題