C言語とは?誕生の歴史や特徴・基礎文法などをわかりやすく解説

C言語は、1972年にAT&Tベル研究所のデニス・リッチー氏が開発したプログラミング言語です。当初はUNIXオペレーティングシステムの開発用途で作られましたが、その後広く一般的なプログラミング言語として使われるようになりました。

C言語は構造化されたプログラムを書くことができるため、大規模なソフトウェア開発でも利用されています。

また、他の高水準言語(JavaやPython等)よりも低レイヤーの処理を行うことが可能であるため、OSやドライバ等のシステムソフトウェア開発でも使用されます。

ここでは、「C言語」の歴史から基本的な文法・特徴について解説していきます。

目次

C言語の歴史

C言語は、1972年にAT&Tベル研究所のデニス・リッチーとケン・トンプソンによって開発されました。

当時、UNIXオペレーティングシステムを開発していた二人は、アセンブリ言語で書かれたUNIXカーネルを高水準言語で記述することが必要だと考えていました。

そこで彼らはB言語というプログラミング言語を作成しましたが、B言語では不十分な部分がありました。

そこで、彼らはB言語から派生した新しいプログラミング言語「C」を開発しました。

C言語は当初UNIXオペレーティングシステムの実装に使用される予定だったものの、その後広く普及することになります。

そして、現在でも多くのOSやアプリケーションがC言語を用いて書かれています。

C言語の特徴

C言語の特徴として、以下の3つが挙げられます。

  • 構造化プログラミングが可能
  • ポインタを扱える
  • シンプルな文法

構造化プログラミングが可能

C言語は構造化プログラミングをサポートしています。これは、大規模なコードでも可読性や保守性を高めることができるため、現代的なプログラム開発では必須の要素です。

ポインタを簡単に扱える

C言語ではポインタを扱うことができます。ポインタはメモリ上のアドレスを指し示す変数であり、効率的なメモリ管理や複雑なデータ構造の実装に役立ちます。

正しく扱わないと致命的なバグに繋がりますが、正しく扱うことでプログラム開発の汎用性・プログラムの最適化が行なえます。

シンプルな文法

C言語はシンプルかつ直感的な文法を持っています

そのため初心者でも比較的簡単に学ぶことができます。

また、多くの現代的なプログラミング言語(例えばJavaやPython)もC言語から影響を受けているため、基礎知識として身に付けておく価値があるでしょう。

以上がC言語の主要な特徴です。次節ではC言語の基本的な文法について見ていきましょう。

C言語の基本的な文法

C言語は、プログラミング初心者にもわかりやすい、比較的簡単な文法で書かれたプログラムを作成することができます。

変数宣言と初期化

変数は、データを格納するためのメモリ領域です。C言語では、変数を使用する前に必ず宣言しなければなりません。変数の宣言方法は以下のように行います。

データ型 変数名;

例えば、整数型(int)の変数numを宣言する場合は以下のように記述します。

int num;

また、同時に初期値を設定したい場合は以下のように記述します。

int num = 10;

条件分岐(if文)

条件分岐(if文)は、「もし○○だったら△△する」という処理を行う際に使用されます。if文の基本構造は以下の通りです。

if(条件式){
    // 条件式が真(true)だった場合に実行される処理
}

例えば、「numが0以上だったら”positive”と表示し、それ以外だったら”negative”と表示する」という処理を行いたい場合は以下のように記述します。

#include <stdio.h>

int main(){
    int num = -5;

    if(num >= 0){
        printf("positive");
    }else{
        printf("negative");
    }

    return 0;
}
negative

上記コードでは、「numが0以上」であるかどうか判定しています。numが-5であるため「negative」と出力されます。

繰り返し処理(for, while, do-while)

繰り返し処理(for, while, do-while)は、「同じ処理を何度も繰り返す」際に使用されます。それぞれ異なる使い方や特徴があります。

for文

for文は指定した回数分ループさせることが可能です。基本構造は以下の通りです。

for(初期化; 条件式; 更新式){
   // 処理内容 
}

例えば、「1から10まで足した結果(sum)を求める」という処理を行いたい場合、

#include <stdio.h>

int main(){
   int i,sum=0;

   for(i=1;i<=10;i++){
      sum += i; 
   }

   printf("%d",sum);

   return 0;
}
55

上記コードではi=1から始まってi<=10までループさせています。sum += i部分で1から10までを加算し、最後にsumが出力されます。

while文

while文でも指定した条件下でループさせることが可能です。基本構造は以下の通りです。

while(条件式){
    // 処理内容 
}

例えば、「iが100未満であれば、numを2倍し続けて出力する」という処理を行いたい場合、

#include <stdio.h>

int main(){
    int i = 1,num = 2;

    while(num<100){
        printf("%d ",num);
        num *=2 ;
    }

    return 0;
}
2 4 8 16 32 64 

上記コードではprintf("%d ",num);部分で現在値num を出力しています。num *=2 ;部分ではnum を2倍しています。

do-while 文

do-while 文も指定した条件下でループさせることが可能です。基本構造は以下の通りです。

do {
      /* 実行内容 */
} while (/* 制御式 */);

do-while 文では、ループ条件に関わらず、必ず1回は実行されます。

そのため、下記のコードは、ループ条件を満たしていませんが、ループ内の処理が一回実行されています。

#include <stdio.h>

int main(){
    int i = 1,num = 2;

    do{
        printf("%d ",num);
        num *= 2;
    }while(num == 0);
 
    return 0;
}
2 

関数とポインタ

関数とは

C言語では、プログラムを構成する要素の一つである「関数」があります。関数は、特定の処理をまとめたものであり、複雑な処理を簡単に扱うことができます。

以下は、関数の定義方法です。

戻り値の型 関数名(引数1, 引数2, ...){
    処理内容
    return 戻り値;
}
int add(int a, int b){
    return a + b;
}

例えば、int add(int a, int b)という関数は、「a」と「b」を呼び出し元から引数として受け取り、加算した結果を返すものです。

この場合、「int」が戻り値の型になります。「add」という名前が付けられており、「a」と「b」が引数になっています。

また、以下は関数呼び出し方です。

変数 = 関数名(引数1, 引数2, ...);
#include <stdio.h>

int add(int a, int b){
    return a + b;
}

int main(){
    
    int num = add(3, 5);
    
    return 0;
}

例えば、int num = add(3, 5);というコードでは、先程作成したadd関数に対して数字3と5を渡しています。そしてその結果(8)が変数numに代入されます。

ポインタとは

C言語ではポインタ変更も重要な概念です。

「ポインタ」とはメモリ上でデータ領域を指し示すために使われる仕組みであり、アドレス演算子(&)や間接参照演算子(*) を使用します。

以下はポインタ宣言方法です。

データ型 * ポインタ変量名;

例えば、int *p;と書くことで整形式(int) のデータ型用ポイント(p) を宣言することが可能です。

また下記コードように&演算子を使うことで取得可能です。

int num = 10;
int *p;

p = # // p に num のアドレスを代入する 

printf("%d\n", *p); // アドレスから num の中身(10) を表示する 
printf("%p\n", p); // p 自体のアドレス表示する 

標準入出力関数

printf()関数

C言語において、文字列や変数の値を出力するためにprintf()関数を使用します。

この関数は、標準出力ストリーム(通常はコンソール画面)に対して指定された書式でデータを表示します。

以下は、printf()関数の基本的な使い方です。

#include <stdio.h>

int main()
{
    int num = 10;
    printf("numの値は%dです。\n", num);
    return 0;
}

上記のプログラムでは、変数numの値を%dという書式指定子で表示しています。%dは整数型変数を表す書式指定子であり、その後ろに続く引数が実際に表示される値となります。

scanf()関数

scanf()関数は、ユーザーから入力したデータを読み込むために使用されます。この関数もprintf()と同様に標準入力ストリーム(通常はキーボード)からデータを受け取ります。

以下はscanf()関数の基本的な使い方です。

#include <stdio.h>

int main()
{
    int num;
    printf("整数値を入力してください:");
    scanf("%d", &num);
    printf("入力された数字:%d\n", num);

    return 0;
}

上記のプログラムでは、「整数値を入力してください:」というメッセージが表示されます。

そしてscanf()関数内で%dという書式指定子が用いられており,&演算子 を用いてnumへアドレス渡しすることで,ユーザーが 入力した数字が格納されます.

C言語で作られた代表的なアプリケーションやシステム

C言語は、システムプログラミングや組み込みシステムなどに広く使われているプログラミング言語です。そのため、多くの代表的なアプリケーションやシステムがC言語で作られています。

まず一つ目はLinuxカーネルです。LinuxはオープンソースのUNIX系オペレーティングシステムであり、その中核となるカーネル部分がC言語で書かれています。

Linuxカーネルは高速性や安定性に優れており、世界中で広く利用されています。

二つ目はMySQLデータベース管理システムです。

MySQLもまたオープンソースのリレーショナルデータベース管理システムであり、C言語(C++を含む)を主要な開発言語として使用しています。MySQLはWebサイトやビジネスアプリケーション等幅広い分野で利用されており、高速性や拡張性に優れた特徴を持っています。

以上のように、C言語は多くの代表的なアプリケーションやシステム開発に使用される汎用性・信頼性・効率性を兼ね備えた重要なプログラミング言語として今後も注目され続けることでしょう。

目次