C LanguageC言語を使い始める

備考

Cは汎用プログラミング言語であり、構造化プログラミング、語彙変数スコープ、再帰をサポートしていますが、静的型システムは多くの意図しない操作を防ぎます。設計上、Cは一般的な機械命令に効率的にマップする構造を提供するため、以前はオペレーティングシステムを含むアセンブリ言語でコード化されていたアプリケーションや、スーパーコンピュータから組み込みシステムまでのコンピュータ用のさまざまなアプリケーションソフトウェア。

低レベルの機能にもかかわらず、言語はクロスプラットフォームプログラミングを促進するように設計されています。標準に準拠して移植可能なCプログラムは、ソースコードをほとんど変更することなく、非常に幅広い種類のコンピュータプラットフォームおよびオペレーティングシステム用にコンパイルできます。この言語は、組み込みマイクロコントローラからスーパーコンピュータまで、非常に幅広いプラットフォームで利用可能になっています。

CはもともとBell Labsで1969年から1973年までDennis Ritchieによって開発され、 Unixオペレーティングシステムの再実装に使用されていました。以来、これまで多くの既存のコンピュータアーキテクチャやオペレーティングシステムで使用可能なさまざまなベンダのCコンパイラを使用して、最も広く使用されているプログラミング言語の1つになっています。

一般的なコンパイラ

Cプログラムをコンパイルするプロセスは、コンパイラとオペレーティングシステムによって異なります。ほとんどのオペレーティングシステムはコンパイラなしで出荷されるため、インストールする必要があります。一般的なコンパイラの選択肢は次のとおりです。

以下のドキュメントは、最も一般的なコンパイラのいくつかを使い始める方法の概要を示しています。

コンパイラCのバージョンサポート

コンパイラには標準Cに対する様々なレベルのサポートがありますが、C99を完全にサポートしていないものがたくさんあります。たとえば、2015年のリリースでは、MSVCはC99の多くをサポートしていますが、言語自体のサポート(前処理は不適合と思われます)やCライブラリ(例: <tgmath.h> )彼らは必ず「実装に依存した選択肢」を文書化していますか? Wikipediaには、一般的なコンパイラが提供するサポートを示す表があります

あるコンパイラ(特にGCC)は、コンパイラプロデューサが必要とする、有益であると考えられる追加の機能を実装するコンパイラ拡張を提供している、あるいは提供し続けているが、現在Cの標準には含まれていない。これらの拡張はコンパイラ固有であるため、相互互換性がないとみなすことができ、コンパイラ開発者は後のコンパイラバージョンでそれらを削除または変更できます。そのような拡張の使用は、一般に、コンパイラフラグによって制御することができる。

さらに、多くの開発者は、ターゲットとする環境またはプラットフォームによって課された特定のバージョンのCのみをサポートするコンパイラを持っています。

コンパイラを選択する場合は、ターゲット環境で使用できる最新バージョンのCを最適にサポートするコンパイラを選択することをお勧めします。

コードスタイル(トピック外):

Cでは空白が重要ではないため(つまり、コードの操作には影響しません)、プログラマはコードを読みやすく理解しやすくするために空白を使用することがよくあります。これをコードスタイルといいます 。これは、ソースコードを記述する際に使用される一連の規則とガイドラインです。行のインデント方法、スペースやタブの使用方法、ブレースの配置方法、オペレータや括弧の周りのスペースの使用方法、変数の名前付け方法などの問題を扱います。

コードスタイルは標準ではカバーされておらず、主に意見に基づいています(さまざまな人々が読みやすいさまざまなスタイルを見つけています)。独自のコードでスタイルに関する最も重要なアドバイスは、一貫性が最も重要であることです。スタイルを選択してそれに固執することです。一般的な使い方には、独自のスタイルを作成するのではなく、しばしばプログラマーが選択するさまざまな名前付きスタイルがあることを説明するだけで十分です。

一般的なインデントスタイルには、K&Rスタイル、Allmanスタイル、GNUスタイルなどがあります。これらのスタイルのいくつかには異なるバリエーションがあります。たとえばAllmanは、通常のAllmanまたは一般的な変種Allman-8のいずれかとして使用されます。人気のあるスタイルの情報は、 Wikipediaにあります。このようなスタイル名は、著者や組織がコードに貢献する多くの人々が使用するために頻繁に発行する標準から取られているので、誰もがスタイルを知っていると簡単にコードを読むことができます。例えば、 GNUフォーマットガイド GNUコーディング標準文書

UpperCamelCase、lowerCamelCase、lower_case_with_underscore、ALL_CAPSなどのような共通の命名規則があります。これらのスタイルは、さまざまなオブジェクトや型で使用するためにさまざまな方法で組み合わされます(マクロでは、多くの場合、ALL_CAPSスタイルが使用されます)

なぜなら、Picoのようなもっと秘密のスタイルは推奨されないのに対し、SOのドキュメントではK&Rスタイルが一般的に使用されることが推奨されています。

C標準ではカバーされていないライブラリとAPI(したがってここでは話題にはなりません):

バージョン

バージョン標準出版日
K&R 該当なし 1978-02-22
C89 ANSI X3.159-1989 1989-12-14
C90 ISO / IEC 9899:1990 1990-12-20
C95 ISO / IEC 9899 / AMD1:1995 1995-03-30
C99 ISO / IEC 9899:1999 1999-12-16
C11 ISO / IEC 9899:2011 2011-12-15

こんにちは世界

"Hello、World"を画面に表示するシンプルなCプログラムを作成するには、 テキストエディタを使用して、次のソースコードを含む新しいファイル( hello.c - ファイル拡張子は.c なければならない)を作成します。

こんにちはC

#include <stdio.h>

int main(void)
{
    puts("Hello, World");
    return 0;
}
 

Coliruのライブデモ

この簡単なプログラムを1行ずつ見てみましょう

#include <stdio.h>
 

この行は、プログラムに標準ライブラリヘッダーファイルstdio.h 内容を含めるようにコンパイラに指示します。ヘッダーは通常、関数宣言、マクロ、およびデータ型を含むファイルです。ヘッダーファイルを使用する前にインクルードする必要があります。この行にはstdio.h が含まれているので、 puts() 関数puts() 呼び出すことができます。

ヘッダーの詳細を参照してください。

int main(void)
 

この行は、関数の定義を開始します。関数名( main )、期待する引数の型と数( void 、意味なし)、この関数が返す値の型( int )を示します。プログラムの実行はmain() 関数から始まります。

{
    …
}
 

中括弧はペアで使用され、コードブロックがどこで開始され、終了するかを示します。それらは多くの方法で使用することができますが、この場合は関数の開始位置と終了位置を示します。

    puts("Hello, World");
 

この行はputs() 関数を呼び出してテキストを標準出力(デフォルトではスクリーン)に出力し、その後に改行を続けます。出力される文字列は、かっこ内に含まれます。

"Hello, World" は、画面に書き込まれる文字列です。 Cでは、すべての文字列リテラル値は二重引用符"…" 中になければなりません。

文字列の詳細を参照してください。

Cプログラムでは、すべてのステートメントはセミコロン( ; )で終了する必要があります。

    return 0;
 

main() を定義したとき、 int 返す関数として宣言しました。つまり、整数を返す必要があります。この例では、整数値0を返します。これは、プログラムが正常に終了したことを示すために使用されます。 return 0;return 0; ステートメントを実行すると、実行プロセスは終了します。

プログラムの編集

シンプルなテキストエディタには、 vim またはgedit (Linux)、またはNotepad (Windows)があります。クロスプラットフォームエディタには、 Visual Studio Code またはSublime Text も含まれています。

エディタは、RTFやその他の形式ではなくプレーンテキストファイルを作成する必要があります。

プログラムのコンパイルと実行

プログラムを実行するには、まずこのソースファイル( hello.c )を実行可能ファイルにコンパイルする必要があります(例えば、Unix / Linuxシステムではhello 、Windowsではhello.exe )。これは、C言語用のコンパイラを使用して行われます。

コンパイルの詳細を見る

GCCを使用してコンパイルする

GCC (GNU Compiler Collection)は広く使われているCコンパイラです。それを使用するには、ターミナルを開き、コマンドラインを使用してソースファイルの場所に移動してから、次のコマンドを実行します。

gcc hello.c -o hello
 

ソースコード( hello.c )にエラーがない場合、コンパイラはバイナリファイルを作成します。 バイナリファイルの名前は、 -o コマンドラインオプション( hello )の引数で指定します。これが最終的な実行可能ファイルです。

また、プログラムが失敗したり予期しない結果を引き起こす可能性のある問題を特定するための警告オプション-Wall -Wextra -Werror 使用することもできます。この単純なプログラムでは必要ありませんが、これを追加する方法です:

gcc -Wall -Wextra -Werror -o hello hello.c
 

clangコンパイラの使用

clang を使ってプログラムをコンパイルするには、以下を使用できます:

clang -Wall -Wextra -Werror -o hello hello.c
 

設計上、 clang コマンドラインオプションはGCCのオプションに似ています。

コマンドラインからMicrosoft Cコンパイラを使用する

Visual StudioをサポートするWindowsシステムでMicrosoft cl.exe コンパイラを使用している場合、すべての環境変数が設定されている場合、このCの例は、コマンドが実行されるディレクトリ内で実行可能なhello.exe を生成する次のコマンドを使用してコンパイルされます( cl 場合は/W3 ような警告オプションがあり、GCCの場合は-Wall などと大体類似しています)。

cl hello.c
 

プログラムの実行

コンパイルすると、ターミナルで./hello と入力することによってバイナリファイルを実行することができます。実行時に、コンパイルされたプログラムは、コマンドプロンプトにHello, World 、それに続く改行を出力します。

オリジナル "こんにちは、世界!" K&R Cで

以下はオリジナルの "Hello、World!"です。 Brian KernighanとDennis RitchieによるCプログラミング言語 (RitchieはBell LabsのCプログラミング言語のオリジナル開発者)であり、「K&R」と呼ばれています。

K&R
#include <stdio.h>

main()
{
    printf("hello, world\n");
}
 

Cプログラミング言語は、本書の初版(1978年)を書く時点では標準化されておらず、C90コードを受け入れるよう指示されていない限り、ほとんどの現代コンパイラではコンパイルされない可能性があることに注意してください。

main() 明示的な戻り値の型がなく、 return 文が欠けているため、K&Rの本の最初の例は品質が悪いと考えられます。この本の第2版は、古いC89規格用に書かれたものです。 C89では、 main の型はint にデフォルト設定されますが、K&Rの例では環境に定義された値が返されません。 C99以降の標準では、戻り値の型は必須ですが、C99 5.1.2.2.3で導入された特別なケースのため、 main (およびmain のみ)のreturn 文を省略することは安全です。これは0を返すことと等価ですこれは成功を示します。

推奨とほとんどのポータブルフォームmain ホストされているシステムの場合は、 int main (void) プログラムは、任意のコマンドライン引数、または使用しないときint main(int argc, char **argv) プログラムは、コマンドライン引数を使用しないとき。


C90§5.1.2.2.3 プログラム終了

最初の呼び出しからmain 関数への復帰は、 main 関数によって返された値を引数としてexit 関数を呼び出すのと同じです。 main 関数が値を指定しない戻り値を実行すると、ホスト環境に返される終了状態は未定義です。

C90は§6.6.6.4 return 文を

式のないreturn 文が実行され、関数呼び出しの値が呼び出し元によって使用される場合、その動作は未定義です。関数を終了する} 達することは、式なしでreturn 文を実行することと同じです。

C99§5.1.2.2.3 プログラム終了

main 関数の戻り値の型がint と互換性のある型である場合、最初の呼び出しからmain 関数への戻り値は、 main 関数によって返された値を引数としてexit 関数を呼び出すことと等価です。 main 関数を終了する} に達すると値0が返されます。戻り値の型がint と互換性がない場合、ホスト環境に返される終了ステータスは指定されません。