C++で覚えるプログラミングのイロハ【ロ】
書き手:肥田野
前回の記事で、プロジェクトを立ち上げて「Hello World!」と表示させるところまでを作りました。
今回の記事では、ほとんどのプログラミング言語に共通する基本要素を網羅したいと思います。
1回の記事で可能な限り詰め込むことを目標としていますので、分かりにくい部分等ありましたら適宜検索するなどして補完していただきたいと思います。
さて、プログラムは大きく分けて以下の要素で構成されています。
- 変数
- 演算記号
- 制御文
- 関数
まず変数ですが、これは様々な値を格納し、識別するための要素です。
変数に保存できる値には主に以下のものがあります。
- 数値
- 文字列
- オブジェクト
数値はその名の通り、整数や少数ですね。文字列は「abc」や「あ」といった文字、文章の他、記号も含まれます。
そしてオブジェクトは、複数の変数と、後述する「関数」をワンセットにした物を指します。
これらの要素を確認するために、以下のプログラムを書きました。こちらもコピペして確認してみてください(オブジェクトは省いています)。
#include<stdio.h> int main() { int num = 10; char c = 'A'; printf("Number is %d\nCharacter is %c\n",num,c); return 0; }
Ctrl+F5で実行すると、こんな感じに出力されると思います。
C++で変数を作成するには、「型(もしくはデータ型)」(intとかcharとかそういうの)を指定して、任意の変数名を宣言します。型を書き込むのは最初に宣言するときだけで、それ以降に使う場合は変数名だけで識別します。
今回使用する型はint(整数)とchar(文字)です。文字を代入するときには「''(シングルクォーテーション)」で囲みます。「""(ダブルクォーテーション)」と間違えないよう注意してください。
変数に値を代入するときには、「=」を使います。この場合はnumという変数に10を代入しているんですね。
一般的に「=」と言えば等号ですが、プログラムの世界では「代入」です。逆に等号を表したい時は「==」を二つ並べて書きます。この辺は何度もコードを書いているうちにすぐ慣れるでしょう。
前回も使用した「printf」という命令は、文章の中で「%d」、「%c」といった記号を埋め込み、その後カンマ区切りで変数を指定することで、文中に代入することができます。
「\の入力方法」
プログラム中の「\n」ですが、これは改行をさせる役割があります。
しかし、キーボードに「\」が見当たらない! という人もいるかと思います。
その場合は「¥」マークを探して、それを入力してください。
一部の環境では「\」は「¥」に置き換えられるので、「\n」は「¥n」になります。
そういえば、文字列も変数に入るという話だったのに、上のプログラムでは使っていませんね。実はC++にはデフォルトで文字列を扱うための型が用意されていないんです。外部から参照してくることもできますが、折角なのでここは変数を複数一気に扱える便利な要素、「配列」を使ってみます。
これもコピペしちゃいましょう。
#include<stdio.h> int main() { int names[4]; names[0] = 168; names[1] = 8; names[2] = 58; names[3] = 19; char messageA[16] = { 'O','r','y','o','l',' ','i','s',' ','t','i','r','e','d','!','\0'}; char messageB[16] = "Oryol is tired!"; char messageC[] = "Oryol is tired!"; char *messageD = "Oryol is tired!"; printf("%d「%s」\n", names[0], messageA); printf("%d「%s」\n", names[1], messageB); printf("%d「%s」\n", names[2], messageC); printf("%d「%s」\n", names[3], messageD); return 0; }
配列は変数の集合体です。変数名のあとに「[]」をつけて識別します。[]には配列の要素数が入ります。最初のnamesには4つの整数を格納しているのが分かりますね。
配列の要素の代入にはいくつか方法がありますが、namesのように宣言だけしたあと個別に代入してく方法、messageAのように「{}」で囲ってカンマ区切りで代入する方法が一般的です。
このとき注意が必要なのは、配列の1番目は「[0]」であるという点です。これも初心者の方は慣れるのに時間がかかると思いますが、とにかくプログラムを書き続けることで覚えるしかないと思います。
この他、文字列に限ってはmessageBのように「""」で囲って一気に書いてしまうこともできます。さらに、AとBのように宣言と同時に要素を全て代入する場合、要素の数を省略することができます(MessageCのパターン)。
また、「char *」という特殊な型(ポインタ型)を使って配列を表現することもできます。こちらはC++特有の書き方ですので、頭の片隅に留める程度でいいでしょう。
数値の配列ではMessageA、文字列ではMessageCかDの代入方法をよく使うように感じます(主観です)。
ただし、配列の宣言の仕方や利用方法は、プログラム言語によって異なる場合が多いので、新しい言語を学ぶ際には使い分けに注意が必要です。
「\0」とは
MessageAの終端にだけ、「\0」という特殊な文字が入っています。
これは「ヌル文字」というもので、「ここで文章は終わりですよ」と明示する意味があります。
どうしてヌル文字が必要なのかという説明は長くなるので省略しますが、MessageB以降の「""」で囲んだ場合には、プログラム実行時に自動で末尾にヌル文字を挿入してくれるので、これを意識しなくて済むというメリットがあります。
ただしヌル文字という概念を覚えておかないと、思わぬところで原因不明のエラーが起こったりします(筆者も上のプログラムを書くときに、最初ヌル文字を入れ忘れて表示がおかしくなりました。興味のある方は\0を削って試してみてください)
さて、変数の説明はざっとこのくらいにして、次は演算記号です。
「=」の解説は既に済ませてあるので、四則演算とその他の演算子について解説します。
#include<stdio.h> int main() { int num = 10; printf("%d\n", num + 5); printf("%d\n", num - 1); printf("%d\n", num * 3); printf("%d\n", num / 2); printf("%d\n", num % 3); printf("%d\n", num += 8); printf("%d\n", num -= 3); printf("%d\n", num++); printf("%d\n", num--); printf("%d\n", num); return 0; }
四則演算は、「×」が「*」に、「÷」が「/」になっている以外は問題ないでしょう。
「%」ですが、これは割った余りを計算します。10を3で割ると3余り1ですから、1と表示されるはずです。
「+=」「-=」は、直前の変数に値を足す(引く)処理をします。つまり「num = num + 8」と「num += 8」が同じ意味ということですね。
そのため「num += 8」で10が18になったあと、「num -= 3」では18が3引かれて15になったところに注目してください。
勿論「*=」「/=」「%=」も存在しますが、説明は省略します。各自で試してみてください。
最後の「++」「--」ですが、ちょっとこれは癖があります。
基本的には「1足す(1引く)」なのですが、「num++」と書いた場合、numに1が加えられるタイミングは、numの値を確認したあとになります。
そのため「num++」のprintfではnumの値に変化がなく、次のprintfで1足されています。num--も同様です。
逆にnumの値を確認する前に1を足したい場合は「++num」のように書きます。この違いを覚えておくと、思わぬ不具合が起こったときに役立ちます。
ちなみに「**」「//」「%%」はありません。1を掛けたり割ったりしても意味がないですからね。しかも「//」と書くとその後がコメント文になってしまいます。
さて、変数と演算子についての基本はここまでにして、次回は制御文と関数について見ていきましょう。