なぜC/C++では修飾子を使うのか?データ型修飾子の基礎をわかりやすく解説
修飾子(モディファイア)とは何か?
修飾子(modifier)とは、基本となるデータ型の意味を変更し、プログラムの要件に合わせてふるまいを調整するためのキーワードです。
たとえば「時間」を表す変数を考えてみましょう。時間がマイナスになることは論理的にあり得ないため、負の値を扱えない unsigned(符号なし)として宣言するのが自然です。このように、修飾子を使うことでメモリの使い方や表現できる値の範囲を、用途に応じて最適化できるのです。
C++で使える4つのデータ型修飾子
C++では、char、int、double といったデータ型の前に修飾子を付けることができます。主な修飾子は以下の4つです。
- signed … 符号付き(正・負の両方の値を扱える)
- unsigned … 符号なし(0以上の値のみ扱える)
- long … 値の範囲を拡張する
- short … 値の範囲を縮小し、メモリを節約する
それぞれの修飾子が適用できる型
signed、unsigned、long、short の4つの修飾子は、すべて整数型(int系)の基本型に適用可能です。
さらに、以下のような組み合わせも許されています。
char型にはsignedとunsignedを付けられるdouble型にはlongを付けられる(例:long double)
また、signed と unsigned は、long や short 修飾子と組み合わせて使うこともできます。
組み合わせの例
unsigned long int a; // 符号なし長整数として宣言
覚えておきたい省略記法
C++には、unsigned・short・long の整数を宣言するときに使える省略記法が用意されています。int を省略しても、暗黙的に int が指定されたものとみなされるのです。
つまり、以下の2つの宣言は完全に同じ意味になります。
unsigned long a; // int を省略した書き方
unsigned long int a; // 上の行と同じ意味
この省略記法を活用すれば、より簡潔で読みやすいコードを書くことができます。ただし、チーム開発ではコーディング規約に合わせて書き方を統一することをおすすめします。
-
C++にrestrict(制限)修飾子は存在しない?その理由と最適化への活用方法
C++の言語仕様に「restrict」キーワードはない結論から言うと、C++には「restrict」というキーワードは存在しません。C++の予約語(キーワード)の一覧は、C++言語規格のセクション2.11/1に定義されていますが、そこにrestrictは含まれていません。restrictはC99で導入されたC言語のキーワードであり、C++の標準規格には採用されていないのです。restrict修飾子とは何かC言語において、restrict修飾されたポインタ(または参照)とは、コンパイラに対する一種の「約束」です。具体的には、そのポインタが有効なスコープ内では、ポインタが指す対象のオブジェクトには
-
C++でvolatile(揮発性)修飾子を使う理由とは?2つの重要な意味をわかりやすく解説
C++におけるvolatile修飾子には、主に次の2つの重要な意味があります。これらを正しく理解することで、組み込み開発などでvolatileを適切に使いこなせるようになります。 volatileが持つ2つの意味 1. 変数の値はコード外の要因で変化する可能性がある volatile付きの変数は、プログラマが書いたコードによって変更していなくても、ハードウェアやOSなどの外部要因によって値が変わる可能性があります。そのため、コンパイラはこの変数の値を読み取るたびに、「前回読み取った値と同じだろう」「最後に格納した値のままだろう」といった仮定をすることができません。必ずその都度、実際にメモリ