C++ の変数と型:int、double、char、string、bool
C++ の変数
C++ 変数は、名前付きストレージ機能を提供します。これにより、プログラマーは必要に応じてデータを操作できます。 C++ では、すべての変数に型があります。変数の型は、変数のメモリ マップのサイズとレイアウト、そのメモリ内に格納できる値の範囲、それに適用できる一連の操作を決定するのに役立ちます。
この C++ チュートリアルでは、次のことを学びます:
- C++ の変数
- C++ の変数の基本型
- C++ で変数を宣言する規則
- C++ 変数のデータ型
- 変数名または識別子
- C++ の Const 修飾子
- C++ の変数のスコープ
- 変数の型変換
- 変数を登録する
- エスケープ シーケンス
C++ の変数の基本型
C++ 変数の基本的な型は次のとおりです:
整数:
整数は、小数部または指数部のない数値リテラル (数値に関連付けられている) です。例。 120、-90 など
ダブル:
倍精度浮動小数点値です。例:11.22、2.345
シャア:
文字リテラルは、単一の文字を単一引用符で囲むことによって作成されます。例:「a」、「m」、「F」、「P」、「}」など
フロート:
浮動小数点リテラルは、小数形式または指数形式のいずれかを持つ数値リテラルです。例:1.3、2.6
文字列リテラル:
文字列リテラルは、二重引用符で囲まれた一連の文字です。例:「お元気ですか?」
ブール:
ブール値 true または false を保持します。
C++ で変数を宣言する規則
変数に名前を付けるための一般的な規則を次に示します。
- C++ の変数名には、アルファベット、数字、アンダースコアのみを使用できます。
- C++ 変数名は数字で始めることはできません。
- 変数名は大文字で始めるべきではありません。
- C++ で使用される変数名をキーワードにすることはできません。たとえば、int は整数を表すために使用されるキーワードです。
- C++ 変数名はアンダースコアで始めることができます。ただし、これは適切な方法とは見なされません。
C++ 変数のデータ型
C++ はプリミティブ型のセット全体を定義します
ボイド type には関連付けられた値がなく、いくつかの状況でのみ使用できます。値を返さない関数の戻り型として最も一般的です。
算術型 文字、整数、ブール値、および浮動小数点数が含まれます。さらに2種類に分けると算術型
<オール>整数型 署名されている場合と署名されていない場合があります。
署名された型 :負または正の数 (ゼロを含む) を表します。符号付きタイプでは、範囲は +ve 値と -ve 値の間で均等に分割する必要があります。したがって、8 ビットの符号付き char は –127 から 127 までの値を保持します。
符号なしタイプ :unsigned 型では、すべての値が>=0 です。8 ビットの unsigned char には、0 から 255 まで (両方を含む) を含めることができます。
変数名または識別子
識別子は、いくつかの文字、数字、アンダースコア文字、またはそれらの組み合わせで構成できます。名前の長さに制限はありません。
識別子は
でなければなりません- 文字またはアンダースコア ('_') で始めます。
- 大文字と小文字が区別されます。大文字と小文字は区別されます:
// 4 つの異なる int 変数を定義します
int guru99, gurU99, GuRu99, GURU99;
C++ 言語では、その使用のためにいくつかの名前が予約されています。
さまざまなプログラミング言語で変数に名前を付けるための多くの受け入れられた規則があります。これらの規則に従うと、プログラムの可読性が向上します。
- 識別子は、少なくともその意味を示す必要があります。
- 変数名は通常小文字です。Guru99 や GURU99 ではなく、guru99 です。
- 通常、定義するクラスは大文字で始まります。
- 複数の単語を含む識別子は、すべての単語を視覚的に区別する必要があります。たとえば、guru99website ではなく guru99_website です。
C++ 変数の宣言と定義
変数の宣言は、それが定義されているスコープ内のプログラムに名前を認識させます。例:
int a=5; int b; char c='A';
int a,b; a=b=1000;
List initialization int a(5); int b{5};
C++ の const 修飾子
ユーザーから取得する入力の数を示す変数 buffsize があるとします。ここでは、プログラム全体で buffsize の値を変更したくありません。値が変化してはならないことがわかっている変数を定義したいと考えています。
そのような場合は、キーワード const を使用してください
const int bufSize = 512; // input buffer size
これは bufSize を定数として定義します。 bufSize を割り当てたり変更しようとすると、エラーが発生します。
ここでは、作成後に const オブジェクトの値を変更することはできません。宣言と初期化が必須である必要があります。それ以外の場合、コンパイラはエラーをスローします。
const int i = get_size(); // ok: initialized at run time const int j = 42; // ok: initialized at compile time const int k; // error: k is uninitialized const int i = 42; const int ci = i; // ok: the value in i is copied into ci
C++ の変数のスコープ
スコープは、変数が意味を持つプログラムのスパンです。ほとんどの場合、同じ名前を使用して、異なるスコープ内の異なるエンティティを参照できます。変数は、宣言された時点から、宣言が表示されるスコープの最後まで表示されます。
#include <iostream> int main() { int sum = 0; // sum values from 1 through 10 inclusive for (int val = 1; val <= 10; ++val) sum += val; // equivalent to sum = sum + val cout << "Sum of 1 to 10 inclusive is "<< sum <<endl; return 0; }
このプログラムは、viz、main、sum、および val の 3 つの名前を定義します。名前空間名 std を、その名前空間の他の 2 つの名前 cout と endl と共に使用します。
- 関数名「main」は中括弧の外側で定義されています。関数名 main は、関数の外部で定義された他のほとんどの名前と同様に、グローバル スコープを持ちます。つまり、一度宣言されると、グローバル スコープにある名前 プログラム全体でアクセスできます。
- 変数 sum は、メイン関数の本体であるブロックのスコープ内で定義されています。宣言のポイントから、メイン関数の本体の残りの部分からアクセスできます。ただし、その外ではありません。これは、変数 sum にブロック スコープがあることを意味します .
- 変数 val は「for ステートメント」のスコープ内で定義されます。そのステートメントでは簡単に使用できますが、メイン関数の他の場所では使用できません。 ローカル スコープがあります .
ネストされたスコープ
スコープには他のスコープを含めることができます。含まれる (またはネストされた) スコープは、内部スコープと呼ばれます。包含スコープは外側のスコープです。
#include <iostream> using namespace std; // Program for illustration purposes only: It is bad style for a function // to use a global variable and also define a local variable with the same name int reused = 42; // reused has global scope int main() { int unique = 0; // unique has block scope // output #1: uses global reused; prints 42 0 cout << reused << " " << unique << endl; int reused = 0; // new, local object named reused hides global reused // output #2: uses local reused; prints 0 0 cout << reused << " " << unique << endl; // output #3: explicitly requests the global reused; prints 42 0 cout << ::reused << " " << unique << endl; return 0; }
アウトプット #1 再利用のローカル定義の前に表示されます。したがって、この出力
ステートメントは、グローバル スコープで定義されている再利用された名前を使用するものです。このステートメントは
を出力します42 0
アウトプット #2 再利用のローカル定義の後に発生します。これで範囲内です。したがって、この 2 番目の出力ステートメントは、グローバル オブジェクトではなく、reused という名前のローカル オブジェクトを単純に使用して出力します
0 0
アウトプット #3 スコープ演算子を使用して、デフォルトのスコープ規則をオーバーライドします。グローバル スコープには名前がありません。したがって、スコープ演算子 (::) の左辺が空の場合。これは、グローバル スコープの右側にある名前を取得する要求として解釈されます。したがって、式はグローバル再利用と出力を使用します
42 0
変数の型変換
ある型の変数を別の型に変換できます。これは「型変換」として知られています。さまざまな C++ 変数の型を変換するためのルールを見てみましょう:
bool 変数に非 bool を割り当てると、値が 0 の場合は false になり、それ以外の場合は true になります。
bool b = 42; // b is true
bool を他の算術型の 1 つに割り当てると、bool が true の場合は 1 になり、bool が false の場合は 0 になります。
bool b = true; int i = b; // i has value 1
int 型の変数に浮動小数点値を代入すると、値が切り捨てられます。格納される値は小数点以下の部分です。
int i = 3.14; // i has value 3
float 型の変数に int 値を代入すると、小数部がゼロになります。通常、浮動変数が対応できるよりも多くのビットが整数にある場合、精度は失われます。
Int i=3; double pi = i; // pi has value 3.0
範囲外の値を符号なし型の変数に代入しようとすると、結果は値 %(modulo) の残りになります
たとえば、8 ビットの unsigned char 型は、0 から 255 までの値を保持できます。この範囲外の値を割り当てると、コンパイラはその値のモジュロ 256 の余りを割り当てます。したがって、上記のロジックにより、8 ビットの符号なし char に –1 を割り当てると、そのオブジェクトの値は 255 になります。
unsigned char c = -1; // assuming 8-bit chars, c has value 255
signed 型のオブジェクトに範囲外の値を代入しようとすると、結果は予測できません。未定義です。プログラムは外見上は動作しているように見えたり、クラッシュしたり、ガベージ値を生成したりする可能性があります。
signed char c2 = 256; // assuming 8-bit chars, the value of c2 is undefined
コンパイラは、ある型の値を別の型の値が期待される場所で使用する場合に、これらと同じ型の変換を適用します。
int i = 42; if (i) // condition will evaluate as true i = 0;
この値が 0 の場合、条件は false です。他のすべての (ゼロ以外の) 値は true になります。同じ概念により、算術式で bool を使用する場合、その値は常に 0 または 1 に変換されます。その結果、算術式で bool を使用することは通常、ほぼ確実に正しくありません。
注意:符号付きと符号なしの型を混在させないでください
符号付きと符号なしが混在する式は、符号付きの値が負の場合、驚くべき間違った結果をもたらす可能性があります。上で説明したように、符号付きの値は自動的に符号なしに変換されます。
たとえば、
のような算術式ではx* y
x が -1 で y が 1 で、x と y の両方が int の場合、値は予想どおり -1 です。
x が int で y が unsigned の場合、この式の値は、コンパイル マシンでの整数のビット数によって異なります。私たちのマシンでは、この式は 4294967295 になります。
変数の登録
レジスタ変数は、メモリ変数に比べてアクセスが高速です。したがって、C++ プログラムで頻繁に使用される変数は、register を使用してレジスタに入れることができます。 キーワード。 register キーワードは、指定された変数をレジスターに格納するようにコンパイラーに指示します。レジスタに入れるかどうかはコンパイラの選択です。一般に、コンパイラ自体は、いくつかの変数をレジスタに入れることを含むさまざまな最適化を行います。 C++ プログラムでは、レジスタ変数の数に制限はありません。ただし、コンパイラは変数をレジスタに格納しない場合があります。これは、レジスタ メモリが非常に限られており、最も一般的には OS によって使用されるためです。
定義するには:
register int i;
コメント
コメントは、コンパイラによって無視されるコードの部分です。これにより、プログラマーはソース コード/プログラムの関連する領域にメモを作成できます。コメントは、ブロック形式または単一行のいずれかで提供されます。プログラムのコメントは説明文です。ソースコードを読む人を助けるC++コードに含めることができます。すべてのプログラミング言語では、何らかの形式のコメントを使用できます。 C++ は、単一行コメントと複数行コメントの両方をサポートしています。
- 一行コメント // で始まり、行末まで続くものです。コメント行の最後の文字が \ の場合、コメントは次の行に続きます。
- 複数行のコメント /* で始まり */ で終わるものです。
/* This is a comment */ /* C++ comments can also * span multiple lines */
エスケープ シーケンス
バックスペースや制御文字などの一部の文字には、可視イメージがありません。このような文字は、印刷不能文字と呼ばれます。その他の文字 (一重引用符、二重引用符、疑問符、バックスラッシュ) は、多くのプログラミング言語で特別な意味を持ちます。
私たちのプログラムは、これらの文字を直接使用することはできません。代わりに、エスケープ シーケンスを使用してそのような char を表すことができます。エスケープ シーケンスはバックスラッシュで始まります。
C++ プログラミング言語では、いくつかのエスケープ シーケンスが定義されています。
改行
\n
垂直タブ
\v
バックスラッシュ
\\
改行
\r
水平タブ
\t
バックスペース
\b
疑問符
\?
フォームフィード
\f
アラート (ベル)
\a
二重引用符
\"
一重引用符
\'
単一の文字であるかのようにエスケープ シーケンスを使用します:
cout << '\n'; // prints a newline cout << "\tguru99!\n"; // prints a tab followed by "guru99!" and a newline
一般化されたエスケープ シーケンス \x の後に 1 つ以上の 16 進数を続けることもできます。または、\ の後に 1 桁、2 桁、または 3 桁の 8 進数を使用します。一般化されたエスケープ シーケンスは、文字の数値を表します。いくつかの例 (Latin-1 文字セットを想定):
\7 (bell) \12 (newline) \40 (blank) \0 (null) \115 ('M') \x4d ('M')
他の文字を使用しているので、定義済みのエスケープ シーケンスを使用できます。
cout << "Hi \x4dO\115!\n"; // prints Hi MOM! followed by a newline cout << '\115' << '\n'; // prints M followed by a newline
まとめ
- C++ 変数は、名前付きストレージ機能を提供します。
- C++ 変数の型:int、double、char、float、string、bool など
- 含まれる (またはネストされた) スコープは内部スコープと呼ばれ、包含スコープは外部スコープです。
- あるタイプの変数を別のタイプに変換できます。これは「型変換」として知られています。
- レジスタ変数は、メモリ変数に比べてアクセスが高速です。
- コメントは、コンパイラによって無視されるコードの部分です。
- バックスペースや制御文字など、一部の文字には画像が表示されません。
C言語