変数・int・double
前回は文字列の表示についてやりましたね。今回はprintfについてもう少し掘り下げるのですが、先に変数について考えてみましょう。
変数って何?
まず、変数とは、数字や文字を入れておくためのものです。そして、この箱には形があります。とりあえず、下の表を見てください。
表記 | 意味 |
---|---|
int | 整数 |
long | 整数(あまり使わない) |
short | 整数(あまり使わない) |
char | 文字(半角)・整数 |
float | 実数 |
double | 実数 |
ここでいろいろと不思議に感じると思います。
なぜ、整数のタイプが3つあったりするのでしょうか。
実はこれは数の上限が関係しています。
変数には扱える数値の限界があります。
たとえば、char型で作った変数は-128〜127までしか扱えません。
また、int型はコンパイラによって扱える数の上限が変わります。(*1)
では変数の作り方を見てみましょう。
型名 変数名;
型名のところには上の表の int や float 見たいなものを書けば大丈夫です。
その後、半角スペースを挟んだ後、変数の名前をつけます。これは好きな名前がつけられますが…
変数につけられる名前はある程度決められています。
1.全角文字は使えない
2.A〜Z, a〜zは使える
3.0〜9は使えるが先頭には持ってこれない
3.アンダースコア(_)も使える
4.int とか double は最初の作るときのみ書く。使うときは書かない。
くらいでしょうか。
では具体例を見てみましょう。
#include <stdio.h> int main(){ int a; int b; double c; return 0; }
コンパイルし、実行してみます。
おそらく何も起こらないと思います。
これだけでは内部で、a, b, cを作ってそのまま終了する、というプログラムになってしまいます。
そうなると、変数がどうなってるのかまったくわかりませんね。
では、変数の中身を表示してみましょう。ここでprintfの新しい機能が出てきます。
printfの"f"
さて、変数の中身をprintfで表示してみましょう。#include <stdio.h> int main(){ int a; printf("aの値は%dです。", a); return 0; }
""の中に何か変なものがありますね。さらに引数(括弧の中に書くもの)も2つあります。
実はprintfは少し特殊な関数なんです。
文字の中に、%dを書くと、int型の変数を埋め込むことができます。
そして、埋め込む変数を、2番目の引数に書きます。
※関数は引数の順番が重要です。逆に書くことはできません。
コンパイルして実行してみると…
何だこれ!?ってなると思います。
※表示される数字はこれとまったく同じになるとは限りません。
まず、このように表示されたのは理由があります。
変数aは作っただけで、中身はまだ何もいじっていません。
このとき、aの中身は何が入っているかわからないのです。
というのも、変数はPCが、メモリの使っていない領域を勝手に探して、あいているところに作ります。
そのため、前に使っていたデータが残ったままなので大体は変な数字が入っています。
よく見ると、コンパイル時に警告(warning C4700)が出ていて、初期化していない変数が使用されていることを示していますね。
変数を使ってみる
変数は作っただけでは意味がありません。変数を使ってみましょう。まず、作ったら、変な数字が入っているので、初期化しなくてはなりません。
初期化するときは以下のように書きます。
#include <stdio.h> int main(){ int a = 0; //0で初期化 printf("aの値は%dです。", a); return 0; }
これで無事aが0で初期化されました。見てのとおり、 = で代入することができます。
変数を作るときに = で代入すると初期化といわれているだけで、どこでも代入はできます。
もう少し見ていきましょう。
#include <stdio.h> int main(){ int a, b = 0; //bを0で初期化,aは作っただけなので何が入っているかわかりません。 a = b; //aにbを代入(今回の場合は0が代入される) a = 6; //aに6を代入(入っていた0に上書きされます) printf(" aの値は%dです。\n bの値は%dです。", a, b); return 0; }
このソースで見てほしいところは3箇所です。
まず、変数を作るときに、同じ型が複数の場合、カンマ(,)で区切って続けて書くことができます。
次に、変数に変数を代入できます。(上の例だと、6行目ではbは0なので、aは0になります)
最後に、printfの引数です。%dが2つになると、追加の引数も2つになります。このとき、表示される順は左からになります。
printfで%を使ったいろいろ
ここまで、%dを使ってint型の変数の中身をprintfを使って表示してきました。しかし、実数を表示したくなることもあるかもしれません。
そうなると、表示する変数の型がintではなくfloatやdoubleになり、%dを使っても正しく表示されません。
そんなときは%f(この後出てくる関数を考慮してdoubleのときは%lfと覚えたほうが良いです)を使います。(*2)
では、次の例を実行してみましょう。
#include <stdio.h> int main(){ double a = 0.5; printf("1つ目の値は%dです。\n2つ目の値は%lfです。", 2, a); return 0; }
まず、確認してほしいのは、double型を受け取る2つ目は%dではなく、%lfを使っている点です。
次に、1つ目のところに直接数字を書いているところです。
実は、引数の中には計算式などを入れても問題ないです。
なお、計算式は次のページで説明します。
*1:最近のコンパイラ、OSでは4バイト分(-2147483648〜2147483647)が多い気がします。
詳しい型の説明はこちら
*2:本来、printf系列はdouble型は%fが正しいのですが、scanfでfloatとdoubleを分けるように使われていたことが
原因で、混合した情報が広がったみたいです。結果的に現在のC/C++言語ではどちらを使っても大丈夫になったので
特に気にする必要はないと思います。
前のページ
詳しい型の説明はこちら
*2:本来、printf系列はdouble型は%fが正しいのですが、scanfでfloatとdoubleを分けるように使われていたことが
原因で、混合した情報が広がったみたいです。結果的に現在のC/C++言語ではどちらを使っても大丈夫になったので
特に気にする必要はないと思います。