Index

HOME > プログラムTOP > C++




C++の基礎知識(4)

【変数篇】

| ●宣言と初期化 | ●スコープ | ●配列 | ●文字列 | ●予約語 |
( 記述篇, データ型篇, 定数篇, 演算子篇, 関数篇, 制御文篇, ポインタ篇, 構造体篇, クラス篇, 番外篇 )

sasaraan programming

Exposition

●宣言と初期化

 変数はデータ型を指定して宣言します。変数名は任意に設定できますが、使用できるのは、アルファベットと0から9までの数字、及びアンダーバー( _ )のみです。ただし、一文字目を数字にすることはできません。変数は、宣言した位置以降で有効となります。
char c ;            // 文字型の変数 c の宣言
int age ;           // 整数型の変数 age の宣言
double pi ;         // 浮動小数点形の変数 pi の宣言
enum { red, green, blue }  pricolor;    // 列挙型の定義と同時に変数 pricolor の宣言
enum primarycolor pricolor;            // 列挙型の定義後、変数 pricolor の宣言
 また、変数は、宣言と同時に初期化することができます。
char c = 'g' ;          // 文字型を宣言して 'g' に初期化
int age = 20 ;         // 整数型を宣言して 20 に初期化
double pi = 3.14 ;    // 浮動小数点形を宣言して 3.14 に初期化

●スコープ

 変数には適用範囲があります。通常、関数や制御文などの{}のブロック内で宣言した時は、その中でのみ有効です。同じ変数名でも異なる関数であれば問題なく使用できます。
int number ;    // グローバル変数 : これ以降のすべての関数で使用可能
void func_A() {
    int i ;         // ローカル変数 : func_A のみで使用可能
    ...
}
void func_B() {
    int i ;         // ローカル変数 : func_B のみで使用可能
    ...
} 
 また、識別子を指定して明示的に範囲を指定させることができます。関数外の宣言で指定がない時は外部変数、関数内の宣言で指定がない時は自動変数(auto)とみなされます。外部変数と内部変数の名前が重なった場合は、内部変数が優先的に適用されます。
識別子(種類)宣言場所適用範囲寿命
(auto)(自動変数)関数内関数内関数終了まで
static(静的変数)関数外モジュール内プログラム終了まで
関数内関数内プログラム終了まで
(なし)(外部変数)関数外モジュール内プログラム終了まで
extern(外部変数への参照)関数外モジュール内プログラム終了まで
 表中、「モジュール内」とあるのは、一時にコンパイルされるプログラムの範囲内のことです。なお、静的変数と外部変数は、初期化をしない時でも自動的に 0 で初期化されます。
/* ヘッダファイル hello.h */
#include <stdio.h>
#include <conio.h>

// 外部変数の宣言
char s1[30] = "HELLO WORLD !\n";
char s2[30] = "何かキーを押して下さい";
右の変数 id の値はプログラムが終了するまで保持されるが、main関数以外の他の関数からは参照できない。
/* ソースファイル hello.cpp */
#include "hello.h"

extern char s2[]; //外部変数の参照

// main 関数
void main() {
    static int id = 999 ; // 静的変数 
    printf(s1); // 外部変数s1の出力
    printf(s2); // 外部変数s2の出力
    if (getch()) return;
}  

●配列

 配列は同じデータ型の要素を複数集めたものです。変数名の後ろに []をつけて宣言します。通常、括弧の中には要素数を入れます。
int numbers[10] ;        // int型の要素を10個持った変数numbersを宣言
 配列を初期化するときは{}を使用して、中に要素を並べます。
int numbers[10] = {0, 1, 2, 4, 8, 16, 32, 64, 128, 256, 512} ;	
 各要素には添え字(インデックス)を使ってアクセスします。添え字は必ず 0 から始まります。
int numbers[5] = {1, 2, 4, 8, 16} ;    // 要素数5 : 添え字は0〜4
int fig_1 = numbers[0] ;        // = 0
int fig_2 = numbers[4] ;        // = 16
numbers[1] = 7 ;              // 2 が 7 に変わる
 多次元にわたる配列も定義が可能です。array[2][3] とすると、要素数3の配列を2つ宣言することになります。初期化の際は、視認性をよくするために、次元ごとに{}でくくることができます。
int numbers[2][3] = { {10, 20, 30}, {111, 222, 333} } ;    // 二次元配列
    /* int numbers[2][3] = {10, 20, 30, 111, 222, 333} ; としても同じ */

int fig_1 = numbers[0][0] ;        // = 10
int fig_2 = numbers[0][1] ;        // = 20
int fig_3 = numbers[1][2] ;        // = 333
 配列の個数は省略することもできます。ただし、多次元配列の際は、先頭の要素数のみが省略可能です。
int numbers[] = {0, 1, 2, 4, 8, 16, 32, 64, 128, 256, 512} ;
int numbers[][3] = { {10, 20, 30}, {111 ,222 333} } ;
 配列の要素は省略することもできます。この時、不足する添え字の要素には自動的に 0 が割り当てられます。
int numbers[10] = {0, 1, 2, 4, 8, 16} ;    // 添え字6〜9の要素を省略
int fig_1 = numbers[9] ;                // = 0
 また、配列はポインタと密接な関係があります。配列の場合、配列名は先頭要素のアドレスを指し、添え字分を加算することで配列と同じ表現を実現することができます。
char s[10] = "ABC";    // 文字列
char *p;            // ポインタ
p = s;              // 'A'
p = s + 1;          // 'B'

●文字列

 文字列は文字の配列として表現されます。また、末尾には暗黙的に \0 が付加されますので、配列の要素数は、常に表示される文字数 + 1 となります。要素数を指定する時は、「最大文字数 + 1以上」の個数を設定する必要があります。
 たとえば、 "HELLO WORLD !" という文字列は実際には次のような文字の配列になっています。
char s[14] = "HELLO WORLD !" ;
char s[14] = {'H', 'E', 'L', 'L', 'O', ' ', 'W', 'O', 'R', 'L', 'D', ' ', '!', '\0'} ;
 また、文字コードで指定したり、要素数を省略することもできます。
char s[14] = {72, 69, 76, 76, 79, 32, 87, 79, 82, 76, 68, 32, 33, 0} ;
char s[] = "HELLO WORLD !" ; 
 上記四つのコードは、いずれも同じ文字列 "HELLO WORLD!" を表します。
 可変長文字列を直接定義できる string という新しい型も利用できます。ただし、ヘッダファイル "string" をインクルードする必要があります。また、このような新しいヘッダファイルをインクルードする時は、一般に、 ".h" を記述する代わりに名前空間 (namespace) を指定して利用します。この記述法は、将来廃止が想定されるような古いヘッダファイルにも適用されます。(実際にはコンパイラやバージョンによって記述法は変わります)
#include <string>
using namespace std ;        // std(standard)名前空間を使用するという宣言
string s = "HELLO WORLD !" ;

●予約語

 変数や関数の名前には、アルファベットと数字、及びアンダーバー( _ ) の組み合わせを使用します。ただし、以下に挙げる語句は、プログラム上役割を持った語句なので使用することはできません。

asm, auto, bool, break, case, catch, char, class, const, const_cast, continue, default, delete, do, double, dynamic_cast, else, enum, explicit, export, extern, false, float, for, friend, goto, if, inline, int, long, mutable, namespace, new, operator, private, protected, public, register, reinterpret_cast, return, short, signed, sizeof, static, static_cast, struct, switch, templete, this, throw, true, try, typedef, typeid, typename, union, unsigned, using, virtual, void, volatile, wchar_t, while

www.sasaraan.net

(c) morijoh