C言語
前回、Visual Studio CodeでC言語を勉強するための環境を整えました。
今回はC言語の構文とデータ型に関して勉強していきます。
それでは始めていきましょう。
C言語とPythonの構文の比較
まずはC言語がどのような構文になっているのかみてみましょう。
これは前回作成した「HelloWorld」を出力するプログラムです。
#include <stdio.h>
int main(void)
{
printf("Hello World!");
}
構文を理解するためにPythonでも書いてみましょう。
Jupyter notebook上や対話式で表示する場合は1行で書けてしまいます。
print('Hello World!')
でも実行形式ファイルにする場合はもう少し複雑になります。
def main():
print('Hello World!')
if __name__ == '__main__':
main()
ただC言語と比較するならこちらの方が似ている感じがします。
ということで比較していきましょう。
まず最初の「#include <stdio.h>」はPythonでいうライブラリのインポートです。
ただ今回のように画面に結果を出力するためにも「stdio.h」というライブラリが必要なため、どのようなコマンドに対して、どのようなライブラリが必要なのかは今後知る必要がありそうです。
ちなみにC言語ではライブラリではなく、「ヘッダーファイル」というようです。
次の「int main(void){ }」は関数の定義です。
つまりPythonでいうところの「def main()」というわけです。
大きく異なるところはC言語の最初にある「int」の部分。
これは戻り値の型で、どのような型が出力されるのか、先に明確に定義しておく必要があるようです。
今回はとりあえずこういうものだとしておいて、関数の詳しい使い方に関してはまた別の機会に試してみましょう。
ちなみに「void」は値がない時に使うようですが、これに関してもまた今後勉強していきましょう。
最後に「printf(“Hello World!”);」ですが、これはPythonでいうところの「print(‘Hello World!’)」ということでPrint関数です。
またちなみにC言語ではプログラムはコンパイルされて、実行形式ファイルに変換されるためかPythonの「if __name__ == ‘__main__’」の部分は無いようです。
その代わりにmain関数がプログラム実行時に必ず実行されるようです。
こうやって見てみると、実行形式のPythonプログラムからみると手も足も出ないレベルでの差異ではないと感じました。
データ型
次にC言語とPythonの日常使いそうなデータ型を比較していきましょう。
なかなか分かりにくいですが、比較してみるとこんな感じです。
Python | C | |
文字列(符号付き) | str | char |
文字列(符号なし) | str | unsigned char |
整数(符号付き、範囲は環境依存) | int | int |
整数(符号付き、-2の15乗~2の15乗-1の範囲) | int | short |
整数(符号付き、-2の31乗~2の31乗-1の範囲) | int | long |
整数(符号なし、範囲は環境依存) | int | unsigned |
整数(符号なし、0~2の16乗-1の範囲) | int | unsigned short |
整数(符号なし、0~2の32乗-1の範囲) | int | unsigned long |
小数(有効数字7桁) | float | float |
小数(有効数字16桁) | float | double |
上から見ていきましょう。
まず文字列に関して、Pythonではstr型ですが、C言語では「char型」となります。
この「char型」は文字列だけでなく、整数も格納することができ、その整数に符号がある場合は「char型」、符号なしの場合は「unsigned char型」となります。
そして符号あるなしによって、格納できる範囲が異なり、「char型」の場合は-128から127の範囲、つまり-2の7乗から2の7乗-1の範囲、「unsigned char型」は0から255の範囲、つまり0から2の8乗-1の範囲を格納できます。
もう少しいうとchar型の数字では1Byteの整数を格納することができます。
1 Byte = 8 bit、つまり0と1の並びが8個で1セット(1 Byte)、この8個の0、1の組み合わせで表現できる数字が256個。
そのため符号あり(char型)の場合は0を含めて-2の7乗から2の7乗-1の範囲、符号なし(unsigned char型)の場合は0から2の8乗-1の範囲となるわけです。
他の符号あり、符号なしのデータ型に関しても同じです。
次に整数を見ていきましょう。
整数に関しても符号あり、符号なしがありますが、これはchar型と同じことなので解説は省きます。
そしてC言語では整数はint型、short型、long型と3種類あります。
分かりやすいのはshort型とlong型です。
これは先ほどchar型で格納できる数字が1 Byteだったのに対し、short型では2 Byte、long型では4 Byte(64bit環境だと8 Byte)の数字を格納でき、そのためそれぞれ範囲が異なるというわけです。
そしてint型ですが、これはコンパイルする際に用いるプログラム(コンパイラ)によって、2 Byteか4 Byteかを勝手に選択されてしまうようです。
そのため、範囲が変わって困る場合にはshort型かlong型を使う方がいいようです。
最後に小数ですが、これは「float型」と「double型」に分かれます。
先ほどの「short型」と「long型」のようにfloat型では4 Byteの小数を、double型では8 Byteの小数を格納できるということで範囲の違いだけです。
こう比較してみるとPythonがいかに型を意識せずにプログラミングできるかよく分かりますね。
次回はC言語の変数の定義の仕方とprintf関数に関して勉強していきたいと思います。
ではでは今回はこんな感じで。
コメント