0

これが私のプログラムです:

#include <stdio.h>
int main()
{
    int a=0x09;
    int b=0x10;
    unsigned long long c=0x123456;
    printf("%x %llx\n",a,b,c);//in "%llx", l is lowercase of 'L', not digit 1
    return 0;
}

出力は次のとおりです。

9 12345600000010

私は知りたいです:

  1. 関数printf()はどのように実行されますか?
  2. 引数の数がフォーマットの数と等しくない場合はどうなりますか?

私を助けて、説明をするための例としてこのプログラムを使用してください。

4

3 に答える 3

2

問題は、タイプが一致しないことです。これは未定義の動作です。

2番目の引数bがフォーマットのタイプと一致しません。つまり、何が起こっているのかというとprintf()、bを保持している4バイトを超えて読み取っているということです(printf8バイトのオペランドを期待していますbが、4バイトしかない)。したがって、あなたはがらくたになっています。printf()フォーマットコードが2つしかないため、3番目の引数はまったく出力されません。

引数は通常、メモリ内で連続して(および隣接して)渡されるため、printf()読み取っている余分な4バイトは、実際にはの下位4バイトですc

したがって、最終的に、印刷される2番目の数値はに等しくなりb + ((c & 0xffffffff) << 32)ます。

しかし、繰り返しになりますが、この動作は未定義です。今日のほとんどのシステムはこのように動作します。

于 2011-09-18T09:30:17.127 に答える
1

渡す引数がprintfフォーマット仕様と一致しない場合、未定義の動作が発生します。これは、何かが起こる可能性があり、特定のシステムで偶然目にする結果について推論できないことを意味します。

あなたの場合、%llxrequiresとtypeの引数ですunsigned long longが、。を指定しましたint。これだけで未定義の動作が発生します。

フォーマット固有のものよりも多くの引数を渡すことはエラーではありませんprintf。余分な引数は評価されますが無視されます。

于 2011-09-18T09:32:13.943 に答える
0

printf()フォーマットに従って一度に引数を読み取るためのポインタを増やします。フォーマット引数の数がパラメータの数よりも多い場合、printf()は不明なメモリ位置からデータを出力します。ただし、パラメーターの数がフォーマット引数の数よりも多い場合、害はありません。たとえば、フォーマット引数とパラメータの数が一致しない場合、gccは警告を表示します。

于 2011-09-18T09:32:09.310 に答える