計算 | Programming Place Plus 新C++編

トップページ新C++編

このページの概要

このページでは、コンピュータに計算をさせて、その結果を出力するプログラムを取り上げます。まずは、簡単な整数の足し算・引き算だけに限定しておきます。

以下は目次です。要点だけをさっと確認したい方は、「まとめ」をご覧ください。



計算のプログラム

このページでは、計算のプログラムを取り上げます。まずは、あつかう数を整数だけにして、計算方法も足し算(加算)と引き算(減算)に限定しておきます。もちろん、小数を含んだ計算や、掛け算や割り算をおこなうプログラムを書くことはできますが、その辺りは先のページで取り上げることにします、ゆっくりいきましょう。

Hello, Worldプログラムでは、ソースコード内に "Hello, World\n" という文字列リテラルを書き、std::cout を使って出力しました。すると、出力結果は Hello, World(と改行)になりました。つまり、Hello, Worldプログラムでは、出力したいものを、ソースコードにそのまま書いていました。

計算のプログラムでは、ここが少し違ってきます。

たとえば、「3 + 5」の計算結果、つまり「8」を出力したいとします。だからといって、ソースコードに直接、std::cout << "8"; のように書くわけではありません。当たり前ではありますが、これでは計算しているのは人間であって、コンピュータが計算していません。今やりたいことは、“コンピュータに” 計算させることです。

「3 + 5」という計算をさせるためには、ソースコードには 8 ではなく、「3 + 5」を計算させるための記述を、C++ のルールに沿ったかたちで書かなければなりません。

加算

では、「3 + 5」を C++ ではどう書くのかというと、こう書きます。

3 + 5

そのままですね。なお、+ は半角文字です。

以前説明したように、C++ では空白文字はほぼ自由に入れたり無くしたりできますから、3+5 のように詰めて書いてもかまいません。しかし、詰めすぎると見やすさを低下させるので、3 + 5 が無難だと思います。


では、加算の計算結果を出力するにはどうすればいいでしょうか。

Hello, Worldプログラムのときに説明したように、C++ で何かを出力するには、std::cout を使います。

std::cout << 3 + 5;

これで大丈夫です。注意が必要なのは、"" で囲んでいないことです。"3 + 5" のように "" で囲むと、それは文字列リテラルですから、単にそのまま 3 + 5 という5つの文字が出力されるという結果になります。std::cout << "Hello"; と書いたら Hello が出力されるのと同じことです。

"" で囲まず 3 + 5 と書くことによって、ここはコンピュータが計算して、8 に置き換えるのだと指示していることになります。

【C言語プログラマー】printf関数と違って、std::cout による出力処理では、出力したいものが文字列であっても、整数であっても(さらにほかの型であっても)、使い方を変える必要がありません。%d と %s を間違えるようなミスが起こりえないのですから、printf に対する明確な利点の1つといえます。

3 + 5 の計算をおこなうプログラムの全体像はこうなります。

#include <iostream>

int main()
{
    std::cout << 3 + 5;
}

実行結果:

8

数値を出力したあと、改行する

これだけでもビルドできますし、正しい実行結果も得られますが、Hello, Worldプログラムのときの説明にしたがって、行の終わりでは改行しておくことにしましょう。

改行するには \n を使えばいいのでしたが、\n は文字列リテラルの中にしか書けません。しかし、3 + 5 は文字列リテラルではありません。では \n をどこに書けばいいでしょうか?

1つの方法は、std::cout を2回使うことです。

std::cout << 3 + 5;
std::cout << "\n";

これでもいいのですが、ソースコード上での1行が、出力内容の1行に相当するように書いたほうが分かりやすいので、1行にまとめたいところです。そこで、次のように書きます。

std::cout << 3 + 5 << "\n";

このように、std::cout<< は2回以上繰り返し登場させることが可能です。この場合、左側に書いたものから順番に出力されます。そのため、まず 3 + 5 の計算結果である 8 が出力され、そのあとに \n によって改行されます。

#include <iostream>

int main()
{
    std::cout << 3 + 5 << "\n";
}

実行結果:

8

減算

続いて、減算(引き算)を試してみます。

C++ では、減算(たとえば、10 - 1)を次のように書きます。

10 - 1

加算と同様、別に特別な記法というわけではありません。やはり - は半角文字です

実行できるプログラムとして書くと、次のようになります。

#include <iostream>

int main()
{
    std::cout << 10 - 1 << "\n";
}

実行結果:

9

符号

減算の場合、計算結果が負数(0 より小さい数)になることがありえます。といっても、別に難しいことはありません。10 - 15 を計算させてみます。

#include <iostream>

int main()
{
    std::cout << 10 - 15 << "\n";
}

実行結果:

-5

実行結果のように、-5 が出力されます。負数なので、それをあらわす - が付いています。

負数をあらわすために数の頭に付けられる - は、符号 (sign) と呼ばれます。符号は、ソースコード内で使うこともできます。

#include <iostream>

int main()
{
    std::cout << -5 - 1 << "\n";
}

実行結果:

-6

符号の - と、減算をあらわす - は同じ記号です。このように、同じ記号を別の意味で使うことがよくあります。

符号にはもう1つ + があって、こちらは正の数であることを表します。やはり、加算をあらわす + と同じ記号です。

符号の + は付けても付けなくても意味が変わらないので、普通はいちいち付けません。

#include <iostream>

int main()
{
    std::cout << +3 - 1 << "\n";
}

実行結果:

2

用語を確認

ここで、きちんとした用語を確認しておきます。

リテラル

ソースコードの中にあらわれる 3 とか 5 といった整数の表記を、整数リテラル (integer literal) と呼びます。

【C言語プログラマー】C言語では整数定数 (integer constant) と呼びますが、C++ では整数リテラルと呼びます。意味することは同じと考えていいです。なお、文字列リテラルのほうは、C言語でも文字列リテラルです。

"" で囲まれた文字の並びを文字列リテラルと呼びました。どちらもリテラル (literal) という共通の言葉が付いています。整数リテラルも文字列リテラルも、単にリテラルと呼ぶことがあります。

リテラル(literal)とは「文字通りの」という意味の英単語です。ソースコード上で、35 あるいは "Hello" といった記述は、プログラマーが必要としているデータを文字通り記述したものだといっています。リテラルは、ビルドしても実行しても、なにかほかのものに変えられてしまうことがない、不変なものです。

-5+5 のように符号が付いている場合、全体としては整数リテラルではありません。整数リテラルと呼べるのは 5 の部分であって、-+演算子 です。

演算子

演算子(operator)は、どんな処理をしたいのかをあらわす数文字程度の記号のことです。

加算がしたければ + という記号を使いますし、減算がしたければ - という記号を使いますが、それぞれが演算子です。また、符号の +- も演算子です。

これらの演算子の名称は定まっておらず、さまざまな呼ばれ方をしています。加算や減算の +- は加算演算子と減算演算子、プラス演算子とマイナス演算子、binary + operator と binary - operator などと表現されます。

符号の +- は正符号演算子と負符号演算子、単項プラス演算子と単項マイナス演算子、unary + operator と unary - operator などと表現されます。

新C++編では今後、加算演算子、減算演算子、正符号演算子、負符号演算子と呼ぶことにします。

オペランド

「binary」や「unary」という英単語が登場しましたが、これは、演算子がおこなう処理の対象になるデータが何個あるのかを表しています。日本語では、前者を二項、後者を単項といいます。二項の演算子を二項演算子 (binary operator)、単項の演算子を単項演算子 (unary operator) と表現します。

ここで、“演算子がおこなう処理の対象になるデータ” のことを、オペランド(operand)と呼びます。

二項演算子のオペランドは2個あるということです。加算や減算をあらわす +- は、3 + 5 とか 7 - 1 のように、2つの数とともに使いますから、二項演算子です。また、演算子の左側に来るオペランドを左オペランド (left operand)、右側に来るオペランドを右オペランド (right operand) と呼び分けることがあります。

単項演算子のオペランドは1個です。符号の +- は、+5 とか -1 のように、1つの数とともに使いますから、単項演算子です。

演算子とオペランドを組み合わせたものを (expression) といいます。加算演算子や減算演算子を使った計算式は代表的な式です。

式の終わりに ; が付いている場合には、全体としては、 (statement) と呼びます。

3 + 5   <-- これは式
3 + 5;  <-- これは文。3 + 5 の部分だけをみれば式

長い計算式

ここまでの例はすべて、〇 + △〇 - △ のように、演算子が1つだけの式でした。演算子を増やして、長い計算式にすることも可能です。

#include <iostream>

int main()
{
    std::cout << 4 + 7 - 2 + 3 - 1 << "\n";
}

実行結果:

11

読みにくい場合には、( ) を付けても構いません。

#include <iostream>

int main()
{
    std::cout << (4 + 7) - (2 + 3) - 1 << "\n";
}

実行結果:

5

今のところ、足し算と引き算だけなので関係ありませんが、( ) には数学と同様、計算の順番を強制する効果もあります。C++ でも、掛け算と割り算は、足し算や引き算よりも先に計算されます。ちなみに、{} や [] を使うことはできません。

まとめ


新C++編の【本編】の各ページには、末尾に練習問題があります。ページ内で学んだ知識を確認する簡単な問題から、これまでに学んだ知識を組み合わせなければならない問題、あるいは更なる自力での調査や模索が必要になるような高難易度な問題をいくつか掲載しています。


参考リンク


練習問題

問題の難易度について。

★は、すべての方が取り組める入門レベルの問題です。
★★は、自力でプログラミングができるようなるために、入門者の方であっても取り組んでほしい問題です。
★★★は、本格的にプログラマーを目指す人のための問題です。

問題1 (確認★)

3 + 5"3 + 5" はどのように違いますか?

解答・解説

問題2 (確認★)

次のプログラムの実行結果はどうなりますか?

#include <iostream>

int main()
{
    std::cout << 5 + (-2) << "\n";
}

解答・解説

問題3 (確認★)

問題2のソースコードから、リテラルと呼べるものをすべて選び出してください。

解答・解説

問題4 (確認★)

実行結果が次のようになるプログラムを作成してください。

7 + 8 = 15

ただし、計算結果である 15 の部分は、コンピュータに計算させるようにしてください。

解答・解説

問題5 (確認★)

1~9 までのすべての整数を足し合わせた数を出力するプログラムを作成してください。

解答・解説


解答・解説ページの先頭



更新履歴




はてなブックマーク に保存 Pocket に保存 Facebook でシェア
X で ポストフォロー LINE で送る noteで書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る