2013年8月11日日曜日

C++制御文での変数宣言

C++では変数宣言は制御文の中でもできるようになっています。
もっともよく見かけるのはカウンタ変数をfor文の中で宣言しているパターンでしょう^^

C言語のようにブロックの先頭でカウンタ変数を宣言しなくても、
まとめてかけるので便利です。
 
for (int i = 0; i < 3; i++) {  //カウンタ変数 i の宣言と初期化を同時にしています。
        :

見た目に分かりやすいのではないでしょうか。
では実際のプログラムで具体的に見てみましょう。

プログラム例1
#include <iostream>

using namespace std;

int main(void)
{
    for (int i = 1; i <= 5; i++) {
        cout << i << "の2乗は" << i * i << "ですわ!" << endl;
    }

    return 0;
}

実行結果1
# ./test
1の2乗は1ですわ!
2の2乗は4ですわ!
3の2乗は9ですわ!
4の2乗は16ですわ!
5の2乗は25ですわ!

1から5までの2乗を順に表示しました。
この実行結果についてですが、表示のズレが気になるなと思った方も
いるのではないでしょうか?

そこで表示にこだわったプログラムについて少しだけ試してみたいと思います。
C++ではマニピュレータによる書式設定という方法がありますので、
今回はこれを使用します。 iomanipというヘッダをインクルードする必要があります。

そしてこの場合2乗の数字が最大2桁ですので、あらかじめ2桁表示になるよう
設定してみます。
使用するマニピュレータは、 setw() です。出力時の幅を指定することができます。

プログラム例2
#include <iostream>
#include <iomanip>

using namespace std;

int main(void)
{
    for (int i = 1; i <= 5; i++) {
        cout << i << "の2乗は" << setw(2) << i * i << "ですわ!" << endl;
    }

    return 0;
}

実行結果2
# ./test
1の2乗は  1ですわ!
2の2乗は  4ですわ!
3の2乗は  9ですわ!
4の2乗は16ですわ!
5の2乗は25ですわ!

おぉ、見事に揃いました(^^)
空白では気持ち悪いという方、今度は2桁表示指定で頭をゼロ埋めしてみます^^
その場合はさらにsetfill()を使います。

プログラム例3
        :
    for (int i = 1; i <= 5; i++) {
        cout << i << "の2乗は" << setfill('0') << setw(2) << i * i << "ですわ!" << endl;
    }
        :

実行結果3
# ./test
1の2乗は01ですわ!
2の2乗は04ですわ!
3の2乗は09ですわ!
4の2乗は16ですわ!
5の2乗は25ですわ!


ちょっと遊んでしまいました(^_^;)
どうでしょう?Cの書式指定と比べて、断然覚えづらいですね(;´∀`)
書式指定についてはいずれ詳しくまとめたいと思います。


カウンタの有効範囲について
for文の中で宣言したカウンタ変数の有効範囲(スコープと言います)は、
コンパイラによって違いがあります。
最近の多くのコンパイラでは、カウンタ変数を宣言したfor文の中だけが
有効範囲になります。

有効範囲がfor文の中のみ
      :
    for (int i = 1; i <= 5; i++) {
        cout << i << "の2乗は" << i * i << "ですわ!" << endl;
    }//カウンタ変数 i の有効範囲はここまで
   
    cout << "さらに続きで6以降を計算しよう。" << endl;

    for (int j = 6; j <= 10; j++) {
        cout << j << "の2乗は" << j * j << "です。" << endl;
    }//そしてカウンタ変数 j の有効範囲はここまで
             :

しかし、コンパイラによっては、有効範囲がfor文の外側のブロック内にまで
及ぶ場合があります。

有効範囲がfor文の外側のブロック内
int main(void)
{
    for (int i = 1; i <= 5; i++) {
        cout << i << "の2乗は" << i * i << "ですわ!" << endl;
    }
   
    cout << "forループの外側です。" << endl;

    return 0;//カウンタ変数 i の有効範囲はここまで
}

外側にまで及ぶのはVisualC++というコンパイラではデフォルトのようです。
このブログでは使っていませんが、もしVisualStudioなどで環境構築している場合、
念のため自分のコンパイラがどちらなのか、把握しておくとよいでしょうね。



今日の名言
今度、何か手の付けられないような困難に出会ったら、思い切ってその中に飛び込み
不可能と思っていたことを可能にすることだ。自分の能力を完全に信頼していれば、
必ずやれる。
                                     デール・カーネギー

自信は大事業を行うための一番の必要条件である。
                                     サミュエル・ジョンソン

大事のためには、いつ何時でも自分の肉体、安寧、命さえも投げ打つ心構えのない者は
何の値打ちもない人間だ。
                                     セオドア・ルーズヴェルト