恐らく、はじめて質問させていただきます。
大学で習ったC言語を復習しはじめたのですが、以下のソースコードを記述して色々とトライして考えてみたところ、よく分からなくなってしまいました。
なぜ、このような結果になるのでしょうか?
もちろん、printf文の書式内の変数と変数仕様は1対1に対応していなければならないのは分かっているのですが、試しに後ろの「, 変数」のところを省略してみたら、以下のような結果になりました。
###ソースコード(言語は ANSI C です。)
C
1#include <stdio.h> 2 3int main(void) 4{ 5 char a; int b; 6 float c; double d; 7 8 a='K'; b=123456; 9 c=123.456; d=0.123456789; 10 11 printf("a=%c\n"); 12 printf("b=%d\n"); 13 printf("c=%f\t"); printf("c=%15.10f\n"); 14 printf("d=%f\t"); printf("d=%15.10f\n"); 15 16 return 0; 17}
<メッセージ(これは当たり前ですが・・)>
警告 W8004 program02_2'.c 17: 'd' に代入した値は使われていない(関数 main )
警告 W8004 program02_2'.c 17: 'c' に代入した値は使われていない(関数 main )
警告 W8004 program02_2'.c 17: 'b' に代入した値は使われていない(関数 main )
警告 W8004 program02_2'.c 17: 'a' に代入した値は使われていない(関数 main )
<出力結果>
a=
b=2147348480
c=0.000000 c= 0.0000000000
d=0.000000 d= 0.0000000000
試したこと
①printf文内に各変数を1種類ずつ割り当てたところ、'b'に代入した値を使ったときのみ全体が異なる出力結果となりました。
②①より、printf("b=%d\n",b);のところをコメントアウトすると、'a'のみ異なる出力結果となりました。
<①出力結果>
a=ク
b=123456
c=+NAN c= +NAN
d=+NAN d= +NAN
<②出力結果>
a= ←ASCIIコード01の値
c=0.000000 c= 0.0000000000
d=0.000000 d= 0.0000000000
他にも、最初の結果b=2147348480の実態を調べるために、%xで16進数表示をして出力を何回か繰り返したら、7ffdb000~7ffdf000の範囲でランダム(結果的には7ffdf000となることが多かった)に値が出力されたり、
a= と表示されていることからASCIIコード00のNULLが出力されているのではないかと考えたりしたんですが、①の結果からどうも違うようだし、
本来でしたらゴミのデータとしてスルーすべきなのでしょうが、どうも気になって仕方ありません。
なぜ変数仕様%dはこのような特殊な挙動(?)を示し、それにより他の変数仕様の部分の結果までおかしくなるのでしょうか?
補足情報(FW/ツールのバージョンなど)
- OS:Windows8.1
- コンパイラ:Borland C++ 5.5.1 for Win32
- 開発環境:CPad for Borland C++Compiler Ver 2.31
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/02/04 08:40
2020/02/04 08:40
2020/02/04 19:15