異なるデータ型間の混合演算と型変換
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言語は定義された優先順位に従って処理を行います。同じ優先順位の演算子が連続する場合は、左結合または右結合といった「結合性」のルールに基づいて評価順序が決定されます。