C++Builder 2009 ファーストガイド 第六回「C++基礎知識(前編)」

By: Tomohiro Takahashi

Abstract: 第六回は、C++基礎知識の前編としまして、C/C++言語を使ってプログラミングする上で必要不可欠である「制御構造」を中心に説明していきます。

このファーストガイドは、これからC++Builder 2009を使い始める初心者の方を対象に10回に分けて基本的事項を説明していきます。

第六回は、C++基礎知識の前編としまして、C/C++言語を使ってプログラミングする上で必要不可欠である「制御構造」を中心に説明していきます。

    言語の基本要素

言語そのものやC++で利用できる構造を見てゆく前に、C++プログラミング言語のすべての部分に当てはまる基本要素を説明します。

    コメント

C++には、3種類のコメントマーカーがあります。

記号

名前

スコープ

/*

コメント開始

コンパイラは、この記号からコメント終了記号までの文字列をすべて無視する。コメントは複数行にわたってもかまわない

*/

コメント終了

コンパイラは、この記号の後から文の処理を再開する

//

行コメント

このコメントマーカーからその行の終わりまでの文字列はすべて無視される

コメントマーカーは組み合わせて使うことができます。これは、両方のコメントマーカーのセットを任意のソースファイルで使用できることを意味します(たとえば行コメントをコメント開始記号とコメント終了記号の間に挿入できます)。一部のコンパイラではコメント開始記号とコメント終了記号をネストすることが許されていますが、C++標準ではこのようなコメントのネストはサポートされていません。

    

プログラムおよび関数は、それぞれ実行可能なコード行である「文」から構成されています。文には、単文と複合文があります。単文の例としては、代入文や手続きまたは関数呼び出しがあります。

X = 13;             // 変数 X に値 13 を代入する
Greeting = "Hi";    //Greeting に 'Hi' を代入する
MyFunction();       //MyFunction を実行する

複合文は、単文を置ける場所ならどこにでも書くことができます。複合文とは、ブロックとして扱われる文のグループです。複合文は、{ で開始し、 } で終了しなければなりません。複合文の例を以下に示します。

if (X == 13)
{
   ShowMessage( "X made it to Thirteen!" );
   X = 14;
}

C++プログラムの中で単文を置ける場所なら、同様に複合文を置くことができます。以降の例で、次のような表記に注目してください。

<文>;

これは、この位置に単文または複合文を合法的に置くことができることを示しています。

    セミコロン

ここでは悪名高いセミコロンについて説明します。C++を勉強し始めたプログラマは、セミコロンの使い方で一番苦労するようです。Basicの知識がある人にとって、すべてのコード行の終わりにセミコロンを書くのは不自然に思えるかもしれません。C++では、1つの文を構成するコードを複数の行に分けて記述するのは自由です。 事態をさらに悪化させているのは、セミコロンを置いてはいけない状況が存在することです。

規則はこうです --「C++プログラム内の単文だけをセミコロンで区切らなければならない」。

if (X == 13)
{
   ShowMessage( "X made it to Thirteen!" );
   X = 14;  // セミコロンが必要
}           // セミコロンは不要。この } は複合文を終了する

    基本的な制御要素

    演算子

C++には、現代の言語で求められる演算子のほとんどが用意されています。

    代入演算子と等位演算子

C++では、代入演算子として等号("=")を使います。等位性のテストや型付き定数の定義のための2つの等号("==")と混同しないように注意してください。

    算術演算子

以下の表に、C++の算術演算子をすべて示します。

演算子

演算

オペランドの型

結果の型

+

加算

整数または浮動小数点

整数または浮動小数点

_

減算

整数または浮動小数点

整数または浮動小数点

*

乗算

整数または浮動小数点

整数または浮動小数点

/

除算

整数または浮動小数点

整数または浮動小数点

%

剰余(整数剰余)

整数

整数

    関係演算子

以下の表に、C++Builderの組み込み関係演算子を示します。これらの演算子は、すべて論理値(true または false)を返します。

演算子

演算

<

より小さい

>

減算

<=

以下

>=

以上

==

等しい

!=

等しくない

以下に、C++Builderで利用できるその他の演算子を示します。演算子の詳細については、オンラインヘルプを参照してください。

    ビットごとの演算子

演算子

演算

<

左にシフト

>>

右にシフト

&

ビットごとの AND

^

ビットごとの XOR(排他的論理和)

|

ビットごとの内包的 OR

    論理演算子

演算子

演算

&&

論理 AND

||

論理 OR

    代入演算子

演算子

演算

=

代入

*=

積の代入

/=

商の代入

%=

剰余の代入

+=

和の代入

-=

差の代入

<<=

左シフトの代入

>>=

右シフトの代入

&=

ビットごとの AND の代入

^=

ビットごとの XOR の代入

|=

ビットごとの OR の代入

    クラスメンバー演算子

演算子

演算

::

スコープアクセス/解決

.*

クラスメンバー演算子への逆参照ポインタ

->*

クラスメンバーへのポインタへの逆参照ポインタ

    条件演算子

演算子

演算

? :

三項演算子

以下に例を示します。

max = (x > y) ? x : y à "if x > y then max = x else max = y"

    カンマ演算子

演算子

演算

,

関数の引数リストの要素を分離します。

    条件判定構造

C++では、それぞれ特定の用途を持ついくつかの条件判定構造がサポートされます。

    if...else

if...else 文の基本的な構文を次に示します。

if (<論理式>)
   <文>;

else 節を追加してこの基本構文を拡張できます。

if (<論理式>)  <>;
else
   <>;

上記のどちらの例でも、<文> に単文または複合文を置くことができます。

さらに、else のあとにもう1つ if 節を続けるバリエーションも可能です。

if (<論理式>)  <>;
else if (<理式>)  <>;

    switch <x> case

前述の if...else 構文は、条件が少ない場合には効果的ですが、条件がたくさんある場合は扱いが複雑で面倒です。このような場合は、switch 構文が便利です。switch 文の一般的な構文を次に示します。

switch ( <変数> ) {

  case <定数式> : <>; [break;]
    .
    .
    .
  default : <>;

}

case 文は変数を取り、それを値と比較します。1つの case 文の中で、カンマで区切られた複数の値を使用できます。case 構文の例を次に示します。

switch (ch) 
{
         case 'a' :
            printf("\nOption a was selected.\n");
            break;
         case 'b' :
            printf("\nOption b was selected.\n");
            break;
         default :
            printf("\nNOT A VALID CHOICE!  Bye ...");
            return(-1);
 }

この例では、オプション a または b のどちらが選択されたかをチェックしています。どちらも選択されていない場合は、'NOT A VALID CHOICE' という語句が表示されます。

switch 構文内では、単文または複合文を使えることに注目してください。任意の case に対して複数行のコードを実行する場合は、そのコードを { } ペアで囲む必要があります。

    ループ制御

ループ制御は、プログラミング言語の基本アクティビティの 1 つです。C++には、特定の状況にそれぞれ適したいくつかのループ制御が用意されています。

    while

while ループは、ループ条件が偽になるまで文を実行します。while ループの一般的な構文を次に示します。

while ( <条件> ) <>;

ほかの構造と同じく、<条件> のあとには単文または複合文を置くことができます。単文を使った例を次に示します。

while (*p == ' ') p++;

このコードは、*p が ‘ ‘ と評価されなくなるまで p をインクリメントします。

    for

for ループ は、制御変数によって指定された回数だけ必ず文を実行するという点で while ループと異なります。for ループの一般的な構文を次に示します。

for ( [<初期化>] ; [<条件>] ; [<インクリメント>] )  
 { <>; }

通常、制御変数は整数(または整数型)で、(インデックスを示す)"i" がよく使われます。通常、この変数は 値 0 で初期化されますが、任意の値で開始することができます。

たとえば 0 から 100 まで実行するループは、次のように作成します。

   for (int i = 0; i < 100; i++)
   {
      if (i == 8)
         cout << "\ni = " << i;
   }

このループを実行するとき、i の初期値に 0 が設定されます。ループが実行されるごとに、i はインクリメントされます。ループは、i が値 100(終値)になるまで繰り返されます。i は 0 ~ 99 までの値を想定しているので、ループの最後の実行では、`for` ループ内の文は 100 回実行されたことになります。i の値は条件文の値(この場合は 100)よりももはや小さくないので、ループは終了します。

for ループ構文では、インクリメント式として任意の数の有効な式を指定できます。式は有効な整数値に解決されなければなりません。

for ループは、あらかじめループを実行する回数が分かっている場合に最適です。for ループは、配列の要素にアクセスするときなどに使います。

    do...while

3つ目のループ制御構文は、do...while ループです。do...while ループの一般的な構文を次に示します。

do { <文>;} while ( <条件> );

do...while ループは、条件が偽になるまでループ内のすべての文を実行します。do...while ループには、単文または複合文を置くことができます。

do...while ループの例を次に示します。

do {
    printf ("Enter password: ");
    scanf("%s", password);
} while (strcmp(password, checkword));

このコードは、password = checkword になるまで入力を読み取ります。

do...while ループは、ループ内のコードを必ず最低1回は実行したい場合に最適です。ループの終了を判定する条件は1回目のループが実行されたあとで評価されます。

    break と continue

ループに関する最後の話題は、2つの手続き、break と continue についてです。どちらのコマンドも、これまで説明したループ制御構文の中で使用することができます。

break は、それが含まれるループを即座に終了するために使います。break は、特殊なループ条件を設定せずにループを抜ける便利な方法です。

以下に例を示します。

switch (ch) 
{
         case 'a' :
            printf("\nOption a was selected.\n");
            break;
         case 'b' :
            printf("\nOption b was selected.\n");
            break;
         default :
            printf("\nNOT A VALID CHOICE!  Bye ...");
            return(-1);
 }

この例では、break に遭遇すると、プログラムの実行はswitch のあとの最初の文にジャンプします。

もう1つのループ実行修飾子は continue 文です。continue 文は、ループの残りの文をスキップして評価条件に戻ります。したがって、条件に影響を与えるような変化に対しては、continue を使ってループの先頭に戻りその条件を評価することができます。以下に、continue を使った単純な例を示します。

void main ()
{
  for (i = 0; i < 20; i++) {
     if (array[i] == 0)
       continue;
     array[i] = 1/array[i];
  }
}

この例における continue 文は、ゼロによる除算エラーを防ぎます。

continue は、無効な入力をスキップするのに特に便利です。ユーザーが希望に反する値を入力する場合に備えて、continue を使ってループの先頭に戻り、再度入力を求めることができます。

    まとめ

第六回は、C++の基礎知識の前編としまして「制御構造」を中心に説明しました。

第七回は、「C++の基礎知識の後編」としまして、C++でプログラミングを行なう上で必要な「データ型」を中心に解説する予定です。

なお、今回解説した内容についてもっと知りたい場合には、製品に付属するオンラインマニュアル、または、エンバカデロのWebサイトで参照可能なドキュメントをご活用ください。

Server Response from: ETNASC01