C言語概要

  • コンパイル型言語(ソースコードを機械語に変換して実行)
  • 組み込みシステムやシステムプログラム、アプリケーション開発など幅広く利用

注意点

  • 本資料ではC99以降の標準Cを対象とします
  • C言語は型が厳格で、変数宣言時に型指定が必須

Hello World

#include <stdio.h>
int main() {
    printf("Hello, World!\n");
    return 0;
}
  • #include <stdio.h> は標準入出力ライブラリをインクルード
  • int main() はプログラムのエントリーポイント
  • printf関数で文字列を出力
  • return 0; は正常終了を示す

コンパイルと実行方法

  • ソースコードを hello.c として保存
  • コンパイル: gcc hello.c -o hello
  • 実行: ./hello (Linux/Mac) または hello.exe (Windows)

  • C言語では変数や値に必ず型がある
    • 例: int, float, char, double
  • 型によって表現できる値の範囲や演算が異なる

C言語における主な型

  • int: 整数値
  • float: 単精度浮動小数点数
  • double: 倍精度浮動小数点数
  • char: 文字(1バイト)
#include <stdio.h>

int main() {
    int a = 1;
    float b = 1.0f;
    double c = 2.0;
    char d = 'A';
    printf("%d\n", a);
    printf("%f\n", b);
    printf("%f\n", c);
    printf("%c\n", d);
    return 0;
}
  • printf関数で型ごとに書式指定子が異なる点に注意
  • 変数宣言時に型を必ず指定する

変数

  • 変数は値を格納するための「箱」
  • 宣言時に型を指定し、同じ変数に異なる型の値は代入できない
int a = 10;
float b = 3.14f;
char c = 'Z';

演算子

  • 四則演算: +, -, *, /
  • 剰余演算: %(整数型のみ)
  • 代入演算: =, +=, -=, *=, /=
  • 比較演算: ==, !=, <, <=, >, >=
  • インクリメント/デクリメント: ++, --
  • 論理演算: &&, ||, !
int a = 5, b = 2;
printf("%d\n", a + b);
printf("%d\n", a - b);
printf("%d\n", a * b);
printf("%d\n", a / b);
printf("%d\n", a % b);

型変換

  • 異なる型同士の演算では自動的に型変換(暗黙の型変換)が行われる
  • 明示的な型変換(キャスト)も可能
int a = 5;
float b = 2.0f;
printf("%f\n", a / b); // aがfloatに変換される

int c = (int)3.14; // cは3になる

制御文

  • 条件分岐: if文, switch文
  • 繰り返し: for文, while文, do-while文

if文

if (a > 0) {
    printf("aは正です\n");
} else if (a == 0) {
    printf("aはゼロです\n");
} else {
    printf("aは負です\n");
}

while文

int i = 5;
while (i > 0) {
    printf("%d\n", i);
    i--;
}

for文

for (int i = 0; i < 5; i++) {
    printf("%d\n", i);
}

配列

  • 複数の同じ型の値をまとめて扱う
  • 要素数は固定
int scores[5] = {45, 100, 21, 89, 94};
int total = 0;
for (int i = 0; i < 5; i++) {
    total += scores[i];
}
double average = total / 5.0;
printf("平均: %.2f\n", average);

関数

  • よく使う処理をまとめて定義できる
  • 戻り値の型、引数の型を必ず指定
#include <stdio.h>
#include <math.h>

void quadratic(int a, int b, int c) {
    int d = b * b - 4 * a * c;
    if (d > 0) {
        double x0 = (-b + sqrt(d)) / (2.0 * a);
        double x1 = (-b - sqrt(d)) / (2.0 * a);
        printf("x0 = %f, x1 = %f\n", x0, x1);
    } else if (d == 0) {
        double x = -b / (2.0 * a);
        printf("x = %f\n", x);
    } else {
        printf("実数解なし\n");
    }
}

int main() {
    quadratic(1, -3, 2);
    quadratic(1, -2, 1);
    quadratic(1, -1, 1);
    return 0;
}
  • C言語では関数の引数・戻り値の型を必ず指定する
  • 標準ライブラリの関数を使う場合はヘッダファイル(例: #include <math.h>)をインクルード
  • 実数の平方根はsqrt関数を使う
  • 実数リテラルは2.0のように書く

ポインタ(基礎)

  • 変数のアドレス(メモリ上の位置)を扱う型
  • *でポインタ型を宣言、&でアドレスを取得
int a = 10;
int *p = &a;
printf("%p\n", p); // アドレスの表示
printf("%d\n", *p); // ポインタを使って値を参照
  • C言語の特徴的な機能としてポインタがある
  • ポインタは配列や関数の引数などでよく使われる

まとめ

  • C言語は型が厳格で、変数や関数の型指定が必須
  • 制御文や配列、関数、ポインタなど基本的な構文を理解することが重要