int型とdouble型

表現しているデータには種類がある


 上記の規則は、何を意味しているのでしょうか?
 それは、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の表示が得られます。