データ型とC言語
基数の表示
// 10進数、8進数、16進数で値256を表示
#include <stdio.h>
int main(void) {
int val = 256;
printf("dec=%d; oct=%o; hex=%x\n", val, val, val);
printf("dec=%d; oct=%#o; hex=%#x\n", val, val, val);
return 0;
}
10進数は%d、8進数は%o、16進数は%xで表示します。接頭辞(0, 0x)を表示するには%#o、%#xを使用します。
整数型の種類
- short int型: int型より少ないメモリを使用、小さな値の保存に適しています
- long int型: int型より多くのメモリを使用、大きな値の保存に適しています
- long long int型: long型よりさらに大きな値を扱えます(最低64ビット)
- unsigned int型: 非負数のみを扱います。16ビットシステムでは0〜65535の範囲を表現できます
整数オーバーフロー
// 整数オーバーフローのデモンストレーション
#include <stdio.h>
int main(void) {
int max_val = 2147483647;
unsigned int max_uval = 4294967295U;
printf("%d %d %d\n", max_val, max_val + 1, max_val + 2);
printf("%u %u %u\n", max_uval, max_uval + 1, max_uval + 2);
return 0;
}
オーバーフローは未定義動作となります。定数が型の範囲を超える場合、Uサフィックスを付けるか、16進数表記を使用することで警告を回避できます。
各整数型の表示
#include <stdio.h>
int main(void) {
unsigned int num_u = 3000000000U;
short val_s = 200;
long val_l = 65537L;
long long val_ll = 12345678908642LL;
printf("unsigned: %u\n", num_u);
printf("short: %hd, int: %d\n", val_s, val_s);
printf("long: %ld\n", val_l);
printf("long long: %lld\n", val_ll);
return 0;
}
文字型の使用
char型変数の宣言と使用
#include <stdio.h>
// 文字のコード値を表示
int main(void) {
char symbol;
printf("文字を入力してください: ");
scanf("%c", &symbol);
printf("文字 '%c' のコード値: %d\n", symbol, symbol);
return 0;
}
%cで文字を、%dでそのASCIIコード値を表示できます。
ポータブルな整数型
#include <stdio.h>
#include <inttypes.h>
int main(void) {
int32_t precise_val; // 32ビット符号付き整数
precise_val = 123456789;
printf("標準形式: %" PRId32 "\n", precise_val);
return 0;
}
PRId32マクロはinttypes.hで定義され、移植性の高いコードを記述できます。
浮動小数点型
浮動小数点数の宣言と表示
#include <stdio.h>
int main(void) {
float val_f = 123.456f;
double val_d = 123.456;
long double val_ld = 123.456L;
printf("float: %f (%e)\n", val_f, val_f);
printf("double: %lf (%le)\n", val_d, val_d);
printf("long double: %Lf (%Le)\n", val_ld, val_ld);
return 0;
}
丸め誤差の例
#include <stdio.h>
int main(void) {
float large_val = 2.0e20f;
float result;
result = large_val + 1.0f - large_val;
printf("結果: %f\n", result);
return 0;
}
型のサイズ
#include <stdio.h>
int main(void) {
printf("int型: %zu バイト\n", sizeof(int));
printf("char型: %zu バイト\n", sizeof(char));
printf("long型: %zu バイト\n", sizeof(long));
printf("long long型: %zu バイト\n", sizeof(long long));
printf("double型: %zu バイト\n", sizeof(double));
printf("long double型: %zu バイト\n", sizeof(long double));
return 0;
}
文字列と入出力
文字列の基本操作
#include <stdio.h>
#include <string.h>
#define MESSAGE "素晴らしい存在です"
int main(void) {
char name[40];
printf("お名前は? ");
scanf("%s", name);
printf("%sさん、%s\n", name, MESSAGE);
printf("名前の長さ: %zu 文字\n", strlen(name));
printf("メモリサイズ: %zu バイト\n", sizeof(name));
return 0;
}
定数の使用
#include <stdio.h>
#include <limits.h>
#include <float.h>
int main(void) {
printf("システムの数値制限:\n");
printf("intの最大値: %d\n", INT_MAX);
printf("long longの最小値: %lld\n", LLONG_MIN);
printf("1バイト: %d ビット\n", CHAR_BIT);
printf("doubleの最大値: %e\n", DBL_MAX);
return 0;
}
演算子と式
算術演算子
#include <stdio.h>
int main(void) {
int a = 10, b = 3;
printf("和: %d\n", a + b);
printf("差: %d\n", a - b);
printf("積: %d\n", a * b);
printf("商(整数): %d\n", a / b);
printf("商(実数): %.2f\n", (float)a / b);
printf("剰余: %d\n", a % b);
return 0;
}
インクリメントとデクリメント
#include <stdio.h>
int main(void) {
int x = 5, y = 5;
int result1, result2;
result1 = ++x; // 前置
result2 = y++; // 後置
printf("前置: x=%d, result1=%d\n", x, result1);
printf("後置: y=%d, result2=%d\n", y, result2);
return 0;
}
制御文
whileループ
#include <stdio.h>
int main(void) {
int count = 1;
int sum = 0;
while (count <= 10) {
sum += count;
printf("カウント: %d, 累計: %d\n", count, sum);
count++;
}
return 0;
}
forループ
#include <stdio.h>
int main(void) {
for (int i = 1; i <= 5; i++) {
for (int j = 1; j <= i; j++) {
printf("*");
}
printf("\n");
}
return 0;
}
do-whileループ
#include <stdio.h>
int main(void) {
int number;
int sum = 0;
do {
printf("数値を入力(0で終了): ");
scanf("%d", &number);
sum += number;
} while (number != 0);
printf("合計: %d\n", sum);
return 0;
}
配列の基礎
#include <stdio.h>
#define MAX 5
int main(void) {
int scores[MAX];
int total = 0;
// データ入力
for (int i = 0; i < MAX; i++) {
printf("スコア %d: ", i + 1);
scanf("%d", &scores[i]);
}
// 合計計算
for (int i = 0; i < MAX; i++) {
total += scores[i];
}
printf("平均スコア: %.2f\n", (float)total / MAX);
return 0;
}
条件分岐
if文
#include <stdio.h>
int main(void) {
int score;
printf("スコアを入力: ");
scanf("%d", &score);
if (score >= 90) {
printf("成績: A\n");
} else if (score >= 80) {
printf("成績: B\n");
} else if (score >= 70) {
printf("成績: C\n");
} else {
printf("成績: D\n");
}
return 0;
}
文字処理関数
#include <stdio.h>
#include <ctype.h>
int main(void) {
char ch;
printf("文字列を入力: ");
while ((ch = getchar()) != '\n') {
if (islower(ch)) {
putchar(toupper(ch));
} else if (isupper(ch)) {
putchar(tolower(ch));
} else {
putchar(ch);
}
}
return 0;
}