上記の規則は、何を意味しているのでしょうか?
それは、50.0 と書いたものと50 と書いたものは、データの種類が違うと言うことです。
少数点が付く 50.0 のような表現のデータは、double型と呼ばれる8byte情報になります。
対して、小数点がない表現のデータはint型と呼ばれる情報で、4byteのものが多い状況です。
そしてprintf関数は、double型データの表示に%f、
int型データの表示に%dを指定する規則になっており、
使い分けないと正しい表示ができないという訳です。
(printf の間違った使い方に、エラー指摘が起きないので注意が必要)
printf("%f", double型になる計算またはデータ); | ⇒double型を表示 |
printf("%d", int型になる計算またはデータ); | ⇒int型を表示 |
int型の小数点がない表現を整数、
double型の少数点がある表現を実数と呼ぶことがあります。
コンピュータ中で、数値の情報を記憶するのはメモリです。
そしてその記憶方法が、整数と実数では異なっており、
プログラムにおいて、そのデータの記憶方法を指定している訳です。
そして、それは * / + - などを使った演算式にも影響します。
まず、整数同士で演算した結果は、整数の結果になると言う規則があります。 そのため、整数同士の割り算には注意が必要となります。 例えば、次の演算結果は、 2.5になりません。
5 / 2
少数点以下0.5が切り捨てられて、演算結果は2のint型となります。 (これを、printf 表示させる場合、%dの指定でなければ正しく 2 を表示出力できなません。)
また、一方が整数でも、もう一方が実数の場合、
整数のデータを実数に変換してから演算して、結果を実数にするという規則があります。
よって、次の演算式の結果を表示するprintfでは、%fを使うことになります。
11.00000のような表示が得られます。
printf("%f", 3 + 2 * 4.0);
『* や / 』の方が、『 + や - 』より優先的に処理され、2が2.0に変換されて4.0と掛け算されて、8.0が得られます。
それが次の+演算子が働く時、3が3.0に変換され、それが8.0と加算されて11.0になっています。
このように、C言語の演算子には、優先順位があり、
優先順位の高い演算子が先行して処理されることになります。
つまり、『* や / 』の方が、『 + や - 』より高い優先順位になっています。
また、『* と / 』は同じ優先順位になっています。また、『 + と - 』も同じ優先順位になっています。
そして、この優先順位に従い、一つずつ演算に対する結果を求められ、
それが次の演算の対象になる訳です。
そして、その結果はなんらかの型が表現されていることになります。
四則演算などで、同じ優先順位の演算子を複数使うとどの順番で働くのでしょうか?
それは左に位置する演算子から行う規則になって、結合規則とよばれます。
それは、時として思わぬ結果になる場合があります。
printf("%f" , 3 / 2 * 1.0);
/ と * は同じ優先順位なので、/の演算処理から行われます。
3 / 2 の演算結果はint型で1になり、これを 1.0で割るので、1.000000を表示します。
数学的には、同じなのですが、1.0を先頭に移動する次のプログラムでは異なる結果になります。
printf("%f" , 1.0 * 3 / 2 );
1.0 * 3 が先行しますが、3.0の演算結果が得られ、それを2で割ると、1.5のdouble型になります。 よって、1.500000の表示が得られます。