C言語基礎ガイド:データ型から制御構文まで

データ型と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;
}

タグ: C言語 データ型 制御構文 配列 ポインタ

5月18日 07:27 投稿