\section{今回の構文} \subsection{\texttt{\#include}マクロ} コンパイラはソースコードをコンパイルする前にプリプロセッサを実行し、ファイル内に定義されたマクロを展開する。 マクロは普通の文と違い、「;」(セミコロン)が文末に無く、マクロ名の先頭に「\#」(ハッシュ記号)が付く。 \texttt{\#include}はマクロの1つであり、主に関数・変数・定数・型などの宣言が羅列されているヘッダーファイルの内容をマクロが書かれた場所に展開するもので、大抵の場合ソースコードの最上部に書かれている。\cite{cppref_include} よく使用されるヘッダーファイルの一部には以下の物がある\cite{cppref_stdlibheaders}: \begin{itemize} \item \texttt{stdlib.h}:標準ライブラリのこと、メモリ管理や頻出アルゴリズムなどに関する関数などが宣言・定義されている \item \texttt{stdio.h}:標準入出力のこと、ファイル操作などに関する関数が宣言・定義されている \item \texttt{string.h}:文字列操作によく使用される関数を宣言・定義されている \item \texttt{wchar.h}:日本語のようなマルチバイトの文字を扱うための型や関数が宣言・定義されている \item \texttt{math.h}:三角関数や対数関数などの数学関数が宣言・定義されている \end{itemize} \vspace{-0.5cm} \defaultlistingstyle \begin{lstlisting}[language=C,title={\texttt{\#include}マクロ},escapechar=\@] #include <ヘッダーファイル.h> // 1) コンパイラ・システムが指定した // ディレクトリ(フォルダパス)内でファイルを // 探す。 // Linuxならば@\texttt{/usr/include}@の場合が多い。 // また、GCCでは引数に "-I <ディレクトリ>" を // 渡すことで探索パスを実行時に追加できる。@\cite{gcc_man}@ #include "ヘッダーファイル.h" // 2) 書かれているソースコードと // 同じディレクトリの中でファイルを探す。 // 見つからなければ 1) と同じ挙動を取る。 \end{lstlisting} \subsection{\texttt{main}関数} プログラムが呼び出される際に最初に実行される関数。 この関数の戻り値は整数型であるが、これはプログラムの終了が正常であるかどうかを示めすものであり、Linuxでは0が正常終了、1が異常終了などである。 この異常終了判定に使用される値はOSによって異なる。 なので\texttt{stdlib.h}で提供される\texttt{exit()}関数や\texttt{EXIT\_SUCCESS, EXIT\_FAILURE}定数を使うのが望ましい。\cite{cppref_mainfunc} \begin{lstlisting}[language=C,title={\texttt{main}関数}] int main(void) { // プログラム実行時に何も引数を渡す必要がない場合 // 文 return 0; } int main(int argc, char** argv) { // プログラム実行時に引数を渡す場合、argc は呼び出しプログラム名を含む引数の数、 // argv は呼び出しプログラム名を含む引数の値(文字列型)の配列である。 // 文 return 0; } \end{lstlisting} \subsection{\texttt{printf}関数} \texttt{printf}とはPrint Formatのことで、第一引数に書式(文字列)、第二以降の引数に表示したいデータ(変数、定数、リテラル)を羅列する。 この関数は\texttt{stdio.h}を\texttt{#include}することで利用できる。\cite{cppref_printf} \defaultlistingstyle \begin{lstlisting}[language=C,title={\texttt{printf}関数}] printf("<書式>", <データ1>, <データ2>, ...); \end{lstlisting} 書式には以下のような物がある: \begin{lstlisting}[language=C,title={\texttt{printf}の書式(一部)\cite{xiny}}] "%d" // 整数 "%f" // 浮動小数点 "%c" // 文字(単一) "%s" // 文字列 \end{lstlisting} 更に、書式には文字の表示を制御できる特殊文字(escape sequence)があり、一部の文字はソースコードと干渉するためそれらを使用しないと表示できない。特殊文字はバックスラッシュで始まり、ASCII文字1つが続く。 \newpage \begin{lstlisting}[language=C,title={特殊文字(一部)\cite{xiny}}] "\n" // 改行 "\\" // バックスラッシュ "\?" // 疑問符 "\"" // ダブルクウォーテーションマーク "\'" // シングルクウォーテーションマーク \end{lstlisting} \subsection{変数宣言・定義}\label{var_decl_def} 変数はコンピュータのメモリ上にある値が入る箱のような物である。この箱には整数や小数値、文字などが入るが、メモリ上ではすべて1と0で表現されている。 この一次元な1と0の海の中でどうやってプログラムが値の種類を決定しているのかというと、それはコンパイラが機械語に変換する際に変数名に添えられた型から読み出す時の必要な1と0の列の長さを実行ファイルに書き込んでいるのだ。 C言語で変数を扱うには二つの操作が必要である。 1つは変数の宣言、もう1つは変数の定義である。 変数の宣言とは文字通り変数の存在を宣言することである。 具体的にはその変数を格納する場所をメモリ上に作ることである。 そして変数の定義は値の代入と言い替えることができ、宣言で作られた場所に値を書き込む操作である。 ソースコードでは次のようになる: \begin{lstlisting}[language=C,title={変数の例}] int a; // 整数型の変数の宣言 a = 17; // 変数名 a に 17 という値を書き込む \end{lstlisting} 上記の書き方はC99などの標準規格が制定される前のソースコードによく見られるが、C99以降からは1行で宣言と代入が出来るようになっている。\cite{cppref_decl} \begin{lstlisting}[language=C,title={C99以降の変数宣言・代入}] int a = 17; // 整数型の変数 a の宣言と同時に 17 という値を書き込む \end{lstlisting} 型には一部として以下の物がある\cite{xiny}: \begin{itemize} \item \texttt{int}:整数型 \item \texttt{char}:文字型 \item \texttt{float}:32ビット単精度浮遊少数型 \item \texttt{double}:64ビット倍精度浮遊少数型 \end{itemize} なお、一部の型が占有するバイト数はコンパイラやCPUによって異なるが、\texttt{x86\_64}の場合は\texttt{int}型が4バイト、\texttt{char}型が1バイトである。