C言語における演算子と型変換のメカニズム

異なるデータ型間の混合演算と型変換

C言語では、整数型、浮動小数点型、文字型など、異なるデータ型同士を組み合わせて演算を行うことができます。例えば、10 - 'a' * 1.5 のような式も有効です。

演算の際、オペランドのデータ型が異なる場合、コンパイラは演算を実行する前に型を統一します。このプロセスには主に2つのアプローチがあります。

暗黙の型変換(昇格)

データ型が異なる場合、表現範囲が狭い(優先度が低い)型から広い(優先度が高い)型へと自動的に変換されます。これを暗黙の型変換と呼びます。

大きな型 変数名 = 小さな型の変数;

注意点として、この変換は演算評価時のみ一時的に行われるものであり、元の変数そのもののデータ型が変更されるわけではありません。

int num = 15;
double result = num + 10.5; // numは一時的にdoubleとして評価されるが、num自体はint型のまま

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

開発者の意図で強制的に型を変換したい場合は、キャスト演算子を使用します。これにより、必要なデータ型に変換した値を得ることができます。

(型名)(式)
  • (double)val : 変数valの値をdouble型に変換
  • (int)(a + b) : aとbの合計値をint型に変換
  • (int)a + b : aのみをint型に変換してからbと加算

キャスト演算においても、変数自体の型が書き換わるわけではなく、その場での評価値の型が変わるだけである点に留意してください。

キャストのコード例:

#include <stdio.h>

int main(void) {
    double original_value = 7.89;
    int truncated_value;
    
    // 浮動小数点数から整数へのキャスト(小数点以下は切り捨てられる)
    truncated_value = (int)original_value;
    
    printf("Original: %.2f, Truncated: %d\n", original_value, truncated_value);
    return 0;
}

上記のコードでは、original_valueは引き続きdouble型としてメモリに保持されています。

C言語の演算子と式

C言語には多様な演算子が用意されており、これらを用いてデータを操作します。主要な演算子は以下のように分類されます。

分類演算子の例分類演算子の例
算術演算子+ - * / % ++ --ポインタ演算子* &
関係演算子> < >= <= == !=サイズ演算子sizeof
論理演算子! && ||配列演算子[]
ビット演算子<< >> ~ | ^ &キャスト演算子(型)
代入演算子= += -= *= /= %=メンバアクセス演算子. ->
条件演算子? :関数呼び出し演算子()
カンマ演算子,

式(Expression)の概念

式とは、オペランド(被演算子)と演算子をC言語の構文ルールに従って結合したものです。式の分類と評価結果は以下の通りです。

式の種類記述例評価結果の特性
算術式3 + 4.5 * 2.0数値型
関係式x > 0真(1)または偽(0)の整数値
論理式a > 0 && b < 10真(1)または偽(0)の整数値
代入式count = 10右辺から左辺へ値が代入され、その値を返す
カンマ式a = 1, b = 2, c = 3最も右側の式(この場合はc=3)の評価結果

演算子の優先順位と結合性

複数の演算子が含まれる式を評価する際、C言語は定義された優先順位に従って処理を行います。同じ優先順位の演算子が連続する場合は、左結合または右結合といった「結合性」のルールに基づいて評価順序が決定されます。

タグ: C operators type-conversion casting expressions

9月19日 01:46 投稿