C言語/基礎知識

main 関数は、C言語プログラムのエントリーポイントとして機能します。エントリーポイントとは、プログラムの実行が開始される地点であり、プログラム内の最初の関数です。プログラムが実行されると、まずこの関数が呼び出されます。ここでは、main 関数の基本的な説明を行います。
以下は、main 関数の基本形を示したサンプルコードです。
このコードでは、"Hello, world!" という文字列を標準出力に出力し、その後プログラムを正常終了させます。
変数は、実行環境にあるデーターの保存領域で、その内容は値を表すことができます。
C言語では、変数を使用するまえに宣言する必要があります。
というプログラムで考えてみましょう。
int a = 3; は、a という名前で型として int をもつ変数を宣言し 3 で初期化しています。
また、変数を表示する際には、printf("%d", a);のように引用符内で%dなどによって表示方法を指定しなければなりません。%dとは「十進数として表示しろ」という意味です。
識別子(identifiers)は、様々な物の中からある特定のモノ同士が同じこと(あるいは違うこと)の手がかりにするための名前です。 C言語では、変数名も識別子の一種です(ほかに、関数名、構造体タグ・共用体・列挙体のタグ名とメンバー名、ラベル名、typedef名なども識別子です)。 識別子は、「アンダースコア _・英数字・英数字以外の文字」の組合わせで作られますが、先頭の一文字には アンダースコア _ と数字は使えず、英数字以外の文字は処理系によって使えない可能性があります。 識別子の大文字小文字は区別されます。
識別子には、int や if などのキーワードや、printf や boolなどの予約済み識別子も識別子に使えません。
C言語で文法定義で既に使用し識別子に使用することが禁止されている単語のをキーワード(Keywords)といいます。
今後のページの単元では、変数をさらに発展させた「構造体」「共用体」「列挙体」などの新しいデーター構造が出てきますが、それら新しく習うデーター構造でも同様に、そのデータ構造の全体や部分につける名称も識別子なのでキーワードは使えません。
のように、整数を宣言した変数を浮動小数点リテラルで初期化してもコンパイルエラーにはなりません。
初期化を伴わず宣言された自動変数の値は不定( indeterminate )です。このため、参照する前に値を決定する必要があります。
というように、2つの文に分けて記述することもできます。
変数の値を非可逆的に変更することを代入と呼び、典型的には代入演算子 = の左辺値式に変数・右辺に式の値を与えるケースを想起しますが、左辺値式にはポインタによる参照や配列要素の参照、構造体や共用体のメンバーの参照などがあります。
出力結果も入れ替わります。
下記の式の a = a + 1のように、右辺と左辺に同じ変数が含むことも可能です。 =はC言語では、(if文などの条件式の中であっても)等式では無く代入でことに注意してください。
変数(へんすう)とは名前をもったデーターを格納しておく領域のことです。 変数は、一般にメモリー上に確保され、値を代入したり参照したりすることができます。 変数は、型を持ちます。
変数を使用するには前もって宣言をする必要があります。
int は変数のデーター型、a は変数名です。
変数のデーター型とは、メモリー上に確保する領域の大きさや、確保した領域の扱い方などを決定するものである(型指定子)。データー型は扱いたいデーターの種類や値の範囲によって決定します。 「変数名」とはその変数を他の変数と区別するために付ける名前のことで、 変数名に使えるのは、半角英数の小文字と大文字、および_(下線、アンダーライン) です。
また、変数名に int は使えません。int や return などのキーワードは変数名や関数名など利用できません。
。
なお、printfは標準ライブラリーの関数でキーワードではありませんが予約済み識別子で、もしグローバルな変数名に用いてしまうと重複定義となり、リンクに失敗します。
※ 大きさと扱える値の範囲は実装依存なので、上記の数値は一例です。
C言語では、文字を保持するための文字型 char があります。文字列は文字型の配列の '\0' で終端された特殊なケースです。
C言語におけるコメントは、プログラム内でコードの説明や一時的なコードの無効化に使用されます。C言語では、2つの主要なコメントスタイルがあります。
C言語のコメントは、プログラムの可読性を向上させるために重要です。適切にコメントを追加することで、コードの動作や目的を理解しやすくなり、他の開発者とのコラボレーションもスムーズになります。ただし、コメントが過度に使われるとコードの可読性が低下する可能性があるため、コメントの適切な使用には注意が必要です。
C言語のコメントについてさらに詳しく説明します。
コメントは、コードの理解と保守性を向上させるために重要な役割を果たします。適切に使われると、コメントはプログラムのドキュメントとして機能し、他の開発者や将来の自分自身がコードを理解しやすくします。
C言語における式と演算子は、プログラムでデータを操作するための基本的な構成要素です。以下では、C言語における式と演算子について説明します。
C言語にはさまざまなタイプの演算子があります。主な演算子の種類を以下に示します。
これらの演算子を組み合わせることで、複雑な式を作成し、プログラムの振る舞いを制御することができます。演算子には優先順位と結合性があり、これらを理解することは正確な式の評価に重要です。
C言語における算術演算子と代入演算子について説明します。
算術演算子は、数値の計算に使用されます。主な算術演算子は以下の通りです:
代入演算子は、変数に値を代入するために使用されます。代入演算子は、算術演算子と組み合わせて複合代入演算子として使用することもできます。
:
算術演算子と代入演算子を組み合わせることで、変数の値を操作して計算することができます。 これらの演算子は、C言語で数値計算を行う際に広く使用されます。

※ この表の演算子の種類は、演算子の優先順位が高い順番に並んでいます。
と表示され、「1.600000」とは表示されません。
これは、整数どうしの割り算の結果は整数型なるので、端数は切り捨てられたからです(なお、プログラム中の「計算結果は」の後ろは「%f」(浮動小数点)にすることに注意してください)。
除算にあたって、「(double)」のように明示的に型変換する(キャストする)ことにより、他方の項も暗黙的に double に昇格させ、整数演算ではなく浮動小数点数演算を行わせています。
としても、同じように浮動小数点数として除算が行われます(型昇格の規則)。
変数に格納されたの値を使用することを変数の値の参照と呼びます。
参照する際、変数があらかじめ初期化や代入されているよう注意してください。未初期化の変数の値は不定です。
(ここで言う定数はキーワード const によってもたらされたReadOnly属性のことではなく、リテラルのことです。一般にリテラルは定数には含まれます。むしろ無引数マクロを定数というケースがC言語では主流でした。)
定数とは、プログラム実行時に一定の値しかもたない数です。 変数の値がプログラム実行中に変更される場合もあるのに対して、定数の値はプログラム実行中を通して一定です。 ソースコード中で直接に記述された定数を特にリテラルとも呼ぶ。 ここではそのリテラルについて説明します。
なお、これは画面に何も表示することなく、ただちに終了するプログラムです。 このソースコード中の「0」や「1」が定数です。
定数には整数定数、浮動小数点定数、文字定数、文字列定数、などがあります。 整数定数とは整数を記述するための定数で、主に10進数表記が使われます。 浮動小数点定数とは浮動小数点数を記述するための定数で、主に10進数の小数点数表記で記述します。 文字定数とは1バイト文字を記述するための定数で、文字を「'(一重引用符)」で囲む。 文字列定数とは1バイト文字または多バイト文字の文字列を記述するための定数で、文字列を「"(二重引用符)」で囲む。
標準ライブラリーは、プログラミングで頻繁に使用される基本的な機能を提供します。代表的な機能には、入出力 (stdio.h)、文字列操作 (string.h)、数学関数 (math.h) などがあります。
"stdio" は "standard input-output" の略であり、日本語では標準入出力を意味します。入出力はプログラミングにおいて基本的であり、stdio.hの中でも特に printf 関数と scanf 関数の使い方について説明します。
前処理は、翻訳単位の翻訳の前に行われる処理であり、前処理指令は # で始まる行や Pragma 演算子を指します。標準ライブラリーを使用するためには、適切な標準ヘッダーをインクルードする必要があります。
ヘッダーは、型定義や関数宣言やマクロ定義などをひとまとめにし、 ソースファイルやほかのヘッダーでインクルードして使用します。
標準ライブラリーを使用するためには、使用する標準ライブラリーの機能に応じた標準ヘッダーをインクルードする必要があります。 ヘッダーを組み込むには前処理指令の内の1つ #include指令を用います。 printf関数及びscanf関数を使用するためには、stdio.hというヘッダーを組み込む必要があります。
ヘッダーをインクルードする1つの形式
は、ユーザー定義のヘッダーの include に使うものです。
printf 関数は、書式付けされた文字列を標準出力に書き込む関数です。書式付け文字列には、変換指定子が含まれ、これは後続の引数に対応します。
format には、それに続く任意個数の実引数と同じ数だけ(%d のような)変換指定子( conversion specifier )が含まれなれなければなりません。 書式化文字列に含まれる変換指定子の部分が、それに対応する後の実引数の値によって置換されます。
変換指定子は、実引数のデーター型に応じて、主に以下のようになる。
書式付きの文字列定数には、エスケープシーケンス(Escape sequence; 逆斜線表記)を含めることもできます。逆斜線表記という名前ですが、OSによっては、斜線ではなく、いわゆる円マークが表示される場合もありますが、それで正常です。
逆斜線表記とは、\に文字が続くことで特別な意味を表すものです。
なお、数値表示フォーマットを意味する文字列 %d などを(代入ではなく)そのまま表示したい際のエスケープは、\ではなく%です。なので、たとえばprintf("%%dを表示したい");を実行すれば「%dを表示したい」と表示されます。
scanf関数を使うことにより、標準入力(既定値はキーボード)から入力した値を読み取らせることができます。
これを実行すると、まず
と表示されます。
そして、カーソルが点滅するので、そこに整数を入れて、エンターキー(リターンキー)を押す。 たとえば整数 73 を入れると、
と表示されます。
scanfの使用では、「&input」のように、変数名の前に「&」をつける必要があります。なお、この「&」記号は、記憶領域のアドレスという意味を表す。
アドレスについては、高度な説明になるので、ほかのページで後述します。
「なんで変数へのキーボードからの入力のさい、アドレスというものを使うのか?」という疑問には、
左辺値式を関数の引数に渡す方法が他にない。
という答えになります。
左辺値式は代入の左辺になりうる式の事で、a = 1の aが左辺値式です。 他方、関数の引数は値渡しされるので、変数の値を渡すことはできますが、仮引数を変更して元々の変数の値は変わりません。 このため、アドレスを引数として渡し関数の中で間接参照演算子を使い値を書き変えています。
結果
scanf関数の実用には様々な問題を解決する必要があるが、ここではこれ以上説明しません。
scanf 関数は、標準入力からの入力を受け取り、指定された変数に格納します。 変換指定子を使用して、入力された値のデータ型を指定します。
format には、それに続く任意個数の実引数と同じ数だけの変換指定子が含まれなければなりません。 標準入力からの入力が、書式化文字列に含まれる変換指定子に従って、それに対応する後の実引数が指す変数に代入されます。
変換指定子に対応する実引数は、単項&演算子(アドレス参照演算子)を前置します。
これはscanf関数にアドレスを渡すことでオブジェクトへの代入を可能にするためです。