C/C++で変数名が数字で始められない理由を解説
C/C++において、変数名には英字・数字・アンダースコア(_)を使用することができます。C/C++言語にはあらかじめ定義されたキーワード(予約語)が存在し、それ以外の名前はすべて識別子として扱われます。識別子とは、変数や定数、関数などに付ける名前のことです。
しかし、識別子を数字で始めることはできません。これには技術的な理由があります。コンパイラは以下の7つのフェーズ(段階)を通じてソースコードを処理します。
- 字句解析(Lexical Analysis)
- 構文解析(Syntax Analysis)
- 意味解析(Semantic Analysis)
- 中間コード生成(Intermediate Code Generation)
- コード最適化(Code Optimization)
- コード生成(Code Generation)
- 記号表管理(Symbol Table)
上記のどのフェーズも、数字から始まる変数をサポートしていません。その理由は、コンパイラが最初の文字を見た時点で、そのトークンが「数値リテラル」なのか「識別子」なのかを判別しなければならないためです。もし変数名が数字で始まっていた場合、コンパイラはその後に英字が出現するまで、それが数値なのか識別子なのか判断できず、字句解析フェーズまで巻き戻す(バックトラックする)必要が生じます。しかし、コンパイラはバックトラックをサポートしていないため、これは実現できません。したがって、識別子は必ず英字またはアンダースコアで始まるという規則になっています。
以下は、C言語における変数宣言の具体例です。
例1:エラーになるプログラム
#include <stdio.h>
int main() {
int 5s = 8;
int _4a = 3;
int b = 12;
printf("The value of variable 5s : %d", 5s);
printf("The value of variable _4a : %d", _4a);
printf("\nThe value of variable b : %d", b);
return 0;
}このプログラムでは、変数「5s」が数字で始まっているため、「invalid suffix "s" on integer constant(整数定数に対する無効な接尾辞 "s")」というコンパイルエラーが発生します。数字で始まる宣言部分を取り除けば、プログラムは正常に動作します。
修正後のプログラムの例は以下の通りです。
例2:修正後のプログラム
#include <stdio.h>
int main() {
int _4a = 3;
int b = 12;
printf("The value of variable _4a : %d", _4a);
printf("\nThe value of variable b : %d", b);
return 0;
}出力結果
上記プログラムを実行すると、以下のような出力が得られます。
The value of variable _4a : 3 The value of variable b : 12
-
C++で少なくともk個の要素を含む最大合計部分配列を求める方法
問題概要 長さ n の整数配列と正の整数 k が与えられたとき、「要素数が k 個以上の連続する部分配列」の中から合計が最大となるものを求めます。全探索では非効率ですが、カダネのアルゴリズムとスライディングウィンドウを組み合わせることで、O(n) の時間計算量でこの問題を効率的に解くことができます。 アルゴリズムの手順 プログラムの流れは以下の通りです。 配列を初期化します。 サイズ n の max_sum 配列を用意し、max_sum[0] = a[0] とします。 カダネのアルゴリズムを使い、「各インデックスで終わる部分配列の最大合計」をすべて求めて max_sum 配列に保存します。
-
C++の変数入門:型の種類とスコープ(ローカル変数・グローバル変数)の基礎
C++における変数と型 C++では、すべての変数が特定の「型」を持っています。この型によって、次の3つの要素が決まります。 変数が占めるメモリのサイズとレイアウト そのメモリに格納できる値の範囲 変数に対して適用できる演算・操作の種類 変数の宣言は、次の書式で行います。 type variableName; 指定できる型には、int・bool・float・char などの基本データ型(プリミティブ型)のほか、列挙型、他の型へのポインタ、さらに構造体やクラスで定義されたより複雑な型があります。 変数のスコープとは スコープ(scope)とは、プログラムの中で変数が有効となる領域のことです。