C言語

【C言語】第9章第3回:コンパイル時と実行時の違い

コンパイル時と実行時の違いを理解することで、プログラムのエラーを効率的に修正し、最適化するスキルが身につきます。本記事では、これらのプロセスを詳しく解説します。

0. 記事の概要

この記事を読むメリット

  • プログラム実行プロセスの理解:コンパイル時と実行時の違いを学ぶことで、効率的なデバッグが可能になります。
  • エラー修正スキルの向上:コンパイルエラーと実行時エラーの違いを理解し、問題解決能力を高めます。
  • パフォーマンスの最適化:コードがどのように実行されるかを理解し、効率的なプログラムを設計できます。

この記事で学べること

  • コンパイル時と実行時のプロセス
  • エラーの種類とその対処方法
  • コンパイルの役割と実行時の振る舞い

1. コンパイル時の基本

1.1 コンパイル時とは?

コンパイル時は、プログラムが機械語(バイナリコード)に変換されるプロセスを指します。この段階では、以下の処理が行われます:

  • 構文チェック
  • 変数や関数の型チェック
  • ライブラリとのリンク処理

1.2 コンパイル時エラーの例

#include <stdio.h>

int main() {
    int x = 5
    printf("Value of x: %d\n", x);
    return 0;
}

このコードは、セミコロンが欠如しているためにコンパイルエラーが発生します。

2. 実行時の基本

2.1 実行時とは?

実行時は、コンパイルされたプログラムが実際に動作するプロセスを指します。この段階では、メモリの割り当てやユーザーからの入力が処理されます。

2.2 実行時エラーの例

#include <stdio.h>

int main() {
    int arr[5] = {1, 2, 3, 4, 5};
    printf("Value: %d\n", arr[10]); // 配列の範囲外アクセス
    return 0;
}

このコードは、配列の範囲外アクセスにより実行時エラーを引き起こします。

3. コンパイル時と実行時の違い

3.1 エラーの検出タイミング

コンパイル時エラーはコードの翻訳中に検出されますが、実行時エラーはプログラムの実行中に発生します。

3.2 例とその違い

種類発生タイミング
コンパイル時エラーセミコロンの欠如コンパイル時
実行時エラーゼロ除算実行時

4. 応用例

4.1 入力に依存するエラー

#include <stdio.h>

int main() {
    int a, b;
    printf("Enter two numbers: ");
    scanf("%d %d", &a, &b);

    if (b == 0) {
        printf("Division by zero is not allowed.\n");
        return 1;
    }
    printf("Result: %d\n", a / b);
    return 0;
}
動作解説
  1. 入力チェック:`b`が0でないことを確認します。
  2. 条件分岐:ゼロ除算の場合にエラーを防止します。

5. 練習問題

以下の課題に挑戦して、コンパイル時と実行時の違いを理解しましょう。

  1. コンパイル時エラーを意図的に発生させるプログラムを作成してください。
  2. 実行時エラーを防ぐ条件チェックを含むプログラムを作成してください。
  3. 配列の境界外アクセスを防止するプログラムを実装してください。

6. 練習問題の解答と解説

問2の解答

#include <stdio.h>

int main() {
    int num;
    printf("Enter a positive number: ");
    scanf("%d", &num);

    if (num < 0) {
        printf("Error: Negative numbers are not allowed.\n");
        return 1;
    }
    printf("You entered: %d\n", num);
    return 0;
}

このプログラムでは、負の数が入力された場合にエラーを通知します。

7. まとめ

本記事では、コンパイル時と実行時の違い、エラーの種類、そしてその対策について学びました。次回は、メモリ管理と最適化について掘り下げます。