JavaとC言語の違い

2 min読了の目安(約2000字TECH技術記事

はじめまして!エンジニアをやっているコウキと申します。
勉強のアウトプットがてら、Zennで記事をちょこちょこ書いていきます。

新しい言語を勉強する際に、既にそれなりに扱える言語と比較することが多いと思います。
私自身、エンジニアとして2年ほどJavaを主に使ってきたので、最近勉強しはじめたC言語と比較してどのような違いがあるのかに関して今回はまとめてみました。

教材としては「ドットインストール」で基礎を勉強しました。
Progateで学べれば良かったのですが、C言語は対応してないようでしたので、情報は古いですがドットインストールで学ぶことにしました。

javaとの相違点

以下4つ、私がドットインストールで学んで感じたJavaとの相違点になります。
探せばまだまだあるとは思うので、コメントをいただけると主が喜びます。

  • 標準出力する際に再度型の指定が必要
  • 関数の順序(プロトタイプ宣言で回避可能)
  • String型がない(char型の配列で表現)
  • ポインタの概念

それぞれについて詳しく書きます。

標準出力する際に再度型の指定が必要

コードで比較するとこんな感じです。

print.java

int x = 10;

System.out.println(x); // 10
print.c

int x = 10;

printf("%d\n", x); // 10

関数の順序(プロトタイプ宣言で回避可能)

Javaでは、関数の上下は関係なく標準でそのファイル内にあるクラス全てを参照することができます。

order.java
public static void main(String[] args) {
    sayHi() // main関数の下にsayHi関数があるが、エラーはでない
} 

static void sayHi() {
    System.out.println("Hi!");
}

C言語では、関数の上下が関係しており、参照する関数が宣言した関数の下にあるとエラーになる。

order.c
int main(void) {
    sayHi(); // main関数の下にあるため、エラーになる
    return 0;
}

void sayHi(void) {
    printf("Hi!\n");
}

ただ、「プロトタイプ宣言」というのを用いることで回避ができます。
main関数より上に関数名を記述するだけです。

order.c
void sayHi(void); // プロトタイプ宣言

int main(void) {
    sayHi(); // main関数の下にあるため、エラーになる
    return 0;
}

void sayHi(void) {
    printf("Hi!\n");
}

String型がない(char型の配列で表現)

C言語にはString型がありません。String型はCharの配列として表現する必要があります。

string.c

char a[] = "abc";

ポインタの概念

ここが勉強していて一番理解が難しかったです。
Javaでもポインタはあるにはあるらしいのですが、普段から意識して使ったことがなかったため、違いとは言えないと思いますが一通りまとめていきます。

簡単に言うと、メモリに値を保持して利用する。
といった感じですかね。

pointer.c
int main(void) {

    int a = 10; // ここでメモリに10という値が割り当てられる(アドレスを#0000とする)
    int *pa; // ポインタ変数という(変数名の前にアスタリスクをつける)

    pa = &a; // paにアスタリスクはいらない。&はアドレス演算子(#0000が取得できる)

    printf("%d\n", *pa); // 取得したアドレスの値を取得する(10が取得される)
}

用語

  • アドレス演算子
    変数のメモリのアドレスの情報を引っ張ってくる

  • アドレス
    メモリのアドレス:値 のようなイメージ
    上記では、
    #0000:10

型によってアドレスの数が変わってくるため、適切な型を選ぶとパフォーマンス向上に繋がる。
例えば、long型は大きな枠を作る必要がある。その場合アドレスを多く取るので、int型にしたり。

まとめ

C言語はJavaよりも細かく指定できるのがいい点かなーと感じました。
拙いなりに自分なりにまとめてみましたので、もしご指摘などございましたら是非コメント下さい。