変数の基礎
変数を宣言する
プログラムにおいて変数の概念は欠かすことができません
変数とはメモリ内に値や文字列を一時的に確保、保存する技術です
変数には必ず変数名が存在し、保存する場所のラベルのような役目を果たします
C言語では、BASICやJavaScriptなどとは違い必ず使用前に宣言しなければいけません
変数の宣言をするには、まず変数の型を指定します
これは、その変数がどのくらいの記憶領域を確保するのか、どのような使用目的かを明確にします
宣言時にこの変数の型を指定する型指定子と、変数名を指定します
型 変数名
関数や変数の名前はアルファベット、数字、アンダースコア( _ )を使用することができます
型には「型指定子」を指定します
型指定子は以下のような基本形があります
宣言子 | 内容
|
---|
char | 文字データ
|
int | 符号付整数
|
float | 浮動小数点
|
double | 倍精度浮動小数点
|
void | 何も値がない
|
変数は環境によって確保するサイズが異なります
変数に記録(代入)させたいデータが「文字」ならば char を宣言して、整数なら int を宣言します
数値に小数点がつく場合は floatかdoubleになります。floatよりもdoubleのほうが多くの領域を確保します
変数の宣言はカンマで区切ることによって、同時に同じ型の変数を複数宣言することもできます
int a,b,c;
とすれば、int型の変数aとbとcを宣言したことになります
変数の宣言もステートメントのひとつなので、当然末尾にはセミコロンをつけます
この宣言した変数に値を保存するには、保存したいデータを代入しなくてはなりません
代入には算術演算子の = を使います
ただし数学と違い受け取り側(変数)が左辺に、代入するデータが右辺になります
変数名 = 代入式;
では、いろんな型の変数を宣言して値を代入してみましょう
#include <stdio.h>
main()
{
char a;
int b,c;
double d;
a = 'X';
b = 10;
c = 100;
d = 1.1;
}
恐らく多くの処理系で共通して警告が出るでしょう
たぶん「代入した値は使われていない」といった警告文が出ると思います
当然ですが、このプログラムは何もしません
メモリに指定された領域を確保して、その領域に指定された値を代入して終了します
残念ですが、これまでの講座の知識だけでは標準出力に変数の内容を渡せないのです
そこで、このプログラムはエラーさえ出なければ成功です
このプログラムでは、まず変数の宣言を行なっています
char aは1文字代入することができる変数 a を宣言しているのはわかりますね
(ただし、char型は1バイトを確保するので一般的に文字を代入するというだけで、数値も代入できます)
これに文字を代入するにはシングルクォーテーション 「 ' 」を用います
a = 'X' で文字Xを代入しています.。このような文字をクォーテーションで囲んだものを文字定数と呼びます
次にintの宣言ですが int b,c と、カンマで区切ってふたつの整数型変数bとcを宣言しています
整数型変数には、その名のとおり「整数」を保存できます。このプログラムでは b = 10 で変数Bに10を
c = 100 で変数cに100を代入しています
'X'が文字定数ならば、この10や100などは当然定数と呼ばれます
定数とは固定された値のことを言います。Xという文字も、10や100、1.1などは全て定数といえますね
また、b = 10 などの式でbや10のことをオペランドといいます
コンパイラなどのエラー報告の意味を知るのに覚えておくべき用語です
変数を宣言したあとの状態では変数にはまだ何も値が入っていません
その変数に対して何らかの値を代入することを初期化と表現します
上のプログラムでは、a = 'X' などは変数aを初期化しているといえます
しかし、一つ一つの変数を宣言して、その後に初期化していては面倒です
そこで変数の宣言と同時に初期化することもできます
#include <stdio.h>
main()
{
char a = 'X';
int b = 10,c = 100;
double d = 1.1;
}
こうすると、かなりソースがすっきりしますね
フォーマット
さて、変数を宣言して値を代入することはわかりました
しかし、これでは本当に正しく値が代入されているのかどうかわかりません
そこで、いよいよprintf()関数を使って変数の内容を出力したいと思います
printf()関数で文字列以外のデータを出力するにはフォーマットを指定しなければいけません
このフォーマットはしばしば「フォーマット指定子」とか「フォーマットコード」といいます
printf()関数は引数でダブルクォーテーションで囲まれた文字列を出力しました
ですが、あれはどうあがいても文字列定数です。たとえばその文字列の中に10進数定数を含ませたい場合は以下のようにします
printf("プレイ、トラック %d",44);
実は、このパーセント記号%で始まる2文字がフォーマットです
%dは符号付10進整数出力を表します
そしてクォーテーションを抜けてカンマで区切られた先(第2引数以降)が、フォーマット指定部分に反映される内容です
関数に渡す引数がふたつ以上ある場合はカンマで区切るということに注意してください
#include <stdio.h>
main()
{
printf("プレイ、トラック %d",44);
}
このプログラムでは、第2引数の44がフォーマット指定子%dの部分に10進数で書き込まれます
44自体が10進数なので、そのまま プレイ、トラック 44 と出力されます
文字定数の場合は%cで、浮動小数点は%fを使います。詳しくはprint()関数を参照してください
もちろんフォーマット指定子に対応するのは定数だけではありません
そうです、変数を出力するにはフォーマットを指定しなくてはならないのです
これまでのことをひっくるめて、以下のプログラムを作成して下さい
#include <stdio.h>
main()
{
char x = 'X';
float ran = 42.195;
printf("%c感じてみろー!\n",x);
printf("フルマラソンは %fKm",ran);
}
これでやっと、宣言した変数に値を代入してそれを参照するということができるようになりました
この基本が非常に大切なことなので、忘れずに覚えてくださいね
符号なし変数
char型の変数は、1バイトまでの領域を確保します
1バイトは8ビットなので、二進数11111111まで、つまり0〜255までの数が保存可能…のように思えますがちがいます
このとき、特別指定されていなければC言語では符号付変数になります
ようするにマイナスの値も考えられるのです。これは他の型、intやfloat、doubleなどでも同じことが言えます
となれば、char型の変数の場合は200という数を保存することができません
しかし、符号を考えない「符号なし」を宣言すればchar型変数は255までの数を保存できるということになります
マイナスの値が間違いなく存在しない変数の場合は、符号無しを宣言したほうが多くの数値を保存できるということになりますね
符号無しを宣言するにはunsignedを型の前に宣言します
unsigned 型 変数名;
逆に符号付であることを明示的に表すにはsignedを宣言します
signed 型 変数名;
さっそく実験してみましょう
#include <stdio.h>
main()
{
signed char var1 = 200;
unsigned char var2 = 200;
printf("符号付\t\t= %d\n",var1);
printf("符号なし\t= %d",var2);
}
符号付のchar型変数 var1 では200という数は保存できません
意図しない数が表示されたと思います(おそらく56かな?)
それに対して符号なしchar型変数 var2 は200と表示されたはずです
このように、マイナスの値が考えられない変数には符号無しを宣言したほうがメモリの無駄使いになりません
main()関数の戻り値
main()関数も関数であるかぎり戻り値が存在します
今までは戻り値を指定しなかったために、コンパイル時に警告が出ていたと思います
関数には必ず戻り値を指定するべきであり、たとえ何も返さない場合でもvoidという戻り値を指定します
関数終了時に戻り値として呼び出し元に値を返すには、関数の宣言時に戻り値の型を指定する必要があります
型 関数名(引数リスト)
この「型」という部分には、やはり変数の型同様にデータ型を指定します
たとえば
int main(void)
というように指定します
main(void) の void というのは何も値を受け取らない引数という意味ですが
引数の場合のみ、値を受け取らないvoidを省略することができます
つまり int main() でも良いのです。これまでのmain()関数の () という引数リストの意味がわかってもらえたと思います
ただしこれだけでは、関数は何も値を返しません.
関数が終了する場所で、returnステートメントを指定する必要があります
returnは呼び出し側に復帰する(制御を戻す)という意味のステートメントですが、returnの後に戻り値となる式を指定できます
return 戻り値;
ただし戻り値の型は、関数宣言時に指定した型と同じでなくてはいけません
int main() であれば、main()関数は基本的にint型しか返すことができません
main()関数の呼び出し元はおもにOSです。一般的に通常の終了時には0を返すのがお約束です
0以外の値が返された場合はエラーを意味します。OSはこのようにしてプログラムの終了状態をチェックしています
#include <stdio.h>
int main()
{
printf("プログラムを正常終了します");
return 0;
}
このプログラムはコンパイル時に警告を出さないはずです
returnや戻り値、引数の詳しい内容は「関数」の章で詳しく取り上げるので
ピンとこない、よくわからない、いまいちイメージがハッキリしないという状況でもかまいません
ANSI C標準では、main()関数は int main() と記述することを標準としています
昔のC言語の本では void main(void) などとしているものもあるかもしれませんが
このような書き方は推奨されません。現代は int main() なのです
return [expr];
現在の関数を終了して呼び出し元に操作を復帰します
このときexprで指定されている式を評価して返します
expr 関数が返す値を指定します
特別関数が値を返す必要がない場合でも、通常終了かエラーかを判断するためint型の0か1を返すのが一般的です