C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++の型変換を徹底解説!暗黙的変換と明示的変換(キャスト)の違いとは

C++には、異なるデータ型同士を扱う際に欠かせない「型変換(タイプコンバージョン)」の仕組みが備わっています。型変換には主に2種類あり、それぞれ暗黙的型変換(implicit conversion)明示的型変換(explicit conversion)と呼ばれます。

本記事では、それぞれの型変換の特徴や動作の違いを、具体的なコード例とともにわかりやすく解説します。

暗黙的型変換(自動型変換)とは

暗黙的型変換は「自動型変換」とも呼ばれ、プログラマが特別な指示を出さなくても、コンパイラが自動的に行う型変換のことです。一つの式の中に複数のデータ型が混在している場合に、この変換が発生します。

変換の際、すべてのデータ型は式の中で最も大きい(表現力の高い)データ型へと昇格されます。昇格の順序は以下の通りです。

bool -> char -> short int -> int -> unsigned int -> long -> unsigned long -> long long -> float -> double -> long double

ただし、暗黙的型変換には注意点もあります。変換の過程で情報が失われる可能性があり、たとえば符号付きの値が符号なしの型に変換されると、符号情報が失われることがあります。

暗黙的型変換のコード例

#include <iostream>
using namespace std;
int main() {
    int a = 10;
    char b = 'a';
    a = b + a;      // charがintに昇格される
    float c = a + 1.0;  // intがfloatに昇格される
    cout << "a : " << a << "\nb : " << b << "\nc : " << c;
}

実行結果

a : 107
b : a
c : 108

この例では、文字'a'(ASCIIコードで97)がint型に昇格されて10と加算され、107になっています。さらに、a + 1.0ではint型の107がfloat型に昇格されて108という結果になります。

明示的型変換(型キャスト)とは

明示的型変換は「型キャスト(type casting)」とも呼ばれ、プログラマが意図的に特定のデータ型へ変換を指示する方法です。C++では主に以下の2つの方法で行えます。

  • キャスト演算子(括弧)を使う方法:C言語から引き継がれた伝統的な記法で、(int)xのように記述します。
  • キャスト演算子を使う方法:C++固有の記法で、static_cast<int>(y)dynamic_castなどを使用します。変換の意図が明確になるため、現代のC++ではこちらが推奨されています。

明示的型変換のコード例

#include <iostream>
using namespace std;
int main() {
    double x = 1.574;
    int add = (int)x + 1;   // 括弧によるキャスト
    cout << "Add: " << add;

    float y = 3.5;
    int val = static_cast<int>(y);  // static_castによるキャスト
    cout << "\nvalue: " << val;
}

実行結果

Add: 2
value: 3

この例では、double型の1.574をint型にキャストすると小数点以下が切り捨てられ1となり、1を加算して2が出力されます。同様に、float型の3.5static_cast<int>で変換すると3になります。

まとめ

C++の型変換には、コンパイラが自動的に行う暗黙的型変換と、プログラマが明示的に指示する明示的型変換(キャスト)の2種類があります。暗黙的変換は便利な反面、意図しない情報の損失を招く可能性があるため、重要な箇所ではstatic_castなどの明示的なキャストを使うことで、コードの意図が明確になり、バグの防止にもつながります。

  1. C++で解く対角トラバースII:リストのリストを対角順に出力する方法

    問題の概要 「リストのリスト」である nums が与えられたとき、そのすべての要素を対角順(ダイアゴナルオーダー)に並べて出力するのがこの問題の目的です。 たとえば、次のような行ごとに長さの異なる配列(ジャグ配列)が入力として与えられた場合を考えてみましょう。 このとき、期待される出力は次のとおりです。 [1, 6, 2, 8, 7, 3, 9, 4, 12, 10, 5, 13, 11, 14, 15, 16] 解法のアプローチ この問題は、各要素を「値と座標のセット」として一旦記録し、対角線ごとの順序になるようにソートし直すことで解けます。具体的な手順は以下の通りです。 結果を格納す

  2. C++で8進数を10進数に変換するプログラムの書き方

    8進数が入力として与えられたとき、それを10進数に変換するのが本記事のテーマです。 コンピュータ上の10進数は基数10で表現されます。一方、8進数は基数8で表現され、使用できる数字は0〜7に限られます。これに対して10進数では、0〜9までの任意の数字を使用することができます。 8進数から10進数への変換手順 右から左へ向かって剰余演算により各桁を取り出し、0から始まるべき乗を掛けます。指数は「桁数 − 1」に達するまで1ずつ増加させます。 8進数を変換するため、べき乗の基数は8となります(8進数の基数が8であるため)。 入力された数値の各桁に基数とべき乗を掛け、その結果を記録します。 すべて