「C言語/記法」の版間の差分

削除された内容 追加された内容
.旻 (トーク | 投稿記録)
加筆 defs of cat, source
全体を修正
1 行
== 文字集合 ==
<ref>『JISX3010:2003』p.12「5.2.1 文字集合」</ref>
 
C言語のプログラムは次にあげる文字を使って記述される。
また、次にあげる文字以外にもコンパイラが対応していれば使用できる。
 
*26個のラテンアルファベットの大文字
<pre>
9 ⟶ 8行目:
N O P Q R S T U V W X Y Z
</pre>
 
*26個のラテンアルファベットの小文字
<pre>
15 ⟶ 13行目:
n o p q r s t u v w x y z
</pre>
:※ラテンアルファベットの各文字の値は、連続しているとは限らない。例えばASCII文字コードでは連続しているが、EBCDIC文字コードでは'A'~'I', 'J'~'R', 'S'~'Z'の3つに分かれ連続していない。<ref>『[迷信] 'A'~'Z' の値は連続している | 株式会社きじねこ』http://www.kijineko.co.jp/tech/superstitions/A-to-Z-is-sequence.html</ref>
※ラテンアルファベットの各文字の値は、
連続しているとは限らない。
例えばASCII文字コードでは連続しているが、
EBCDIC文字コードでは'A'~'I', 'J'~'R', 'S'~'Z'の3つに分かれ連続していない。
<ref>『[迷信] 'A'~'Z' の値は連続している | 株式会社きじねこ』http://www.kijineko.co.jp/tech/superstitions/A-to-Z-is-sequence.html</ref>
 
*10個の10進数字
25 ⟶ 19行目:
0 1 2 3 4 5 6 7 8 9
</pre>
:※0の右側に並んでいる各文字の値は、1つ左側にある文字の値に比べ1だけ大きくなければならない。<ref>『JISX3010:2003』p.12「5.2.1 文字集合」</ref>
1つ左側にある文字の値に比べ1だけ大きくなければならない。
 
*29個の図形文字
40 ⟶ 33行目:
=== 3文字表記 ===
{{Wikipedia|トライグラフ|3文字表記}}
 
<ref>『JISX3010:2003』p.13「5.2.1.1 3文字表記」</ref>
3文字表記(トライグラフシーケンス)とは、次に示す左側の3つの文字の並びである。
 
<pre>
??= #
54 ⟶ 46行目:
??- ~
</pre>
3文字表記がソースファイルの中にある場合、その3つの文字の並びを同じ行の右側の対応する1文字に置き換える。これら以外の3文字表記は、存在しない。上に掲げた3文字表記の始まりとならない?は、置き換えない。3文字表記は、7ビットUS ASCII符号集合の部分集合であるISO/IEC646で規定する普遍符号集合に定義がない文字の入力を可能にする。<ref>『JISX3010:2003』p.13「5.2.1.1 3文字表記」</ref>
 
3文字表記がソースファイルの中にある場合、
その3つの文字の並びを同じ行の右側の対応する1文字に置き換える。
これら以外の3文字表記は、存在しない。
上に掲げた3文字表記の始まりとならない?は、
置き換えない。
 
3文字表記は、7ビットUS ASCII符号集合の部分集合であるISO/IEC646で規定する普遍符号集合に定義がない文字の入力を可能にする。
3文字表記に一致する文字列を表記したい場合、「?」の代わりに逆斜線表記(エスケープシーケンス)の「\?」を用いるとよい。
現在、3文字表記はほとんど使われず、コンパイラによっては、実装されていなかったり、デフォルトで無効になっていたりする。
 
=== 多バイト文字 ===
多バイト文字もコンパイラが対応していれば使用できる。<ref>『JISX3010:2003』p.13「5.2.1.2 多バイト文字」</ref>
多バイト文字もコンパイラが対応していれば使用できる。
 
== 字句 ==
字句とはC言語の最小の字句的な単位である。字句には、キーワード、識別子、国際文字名、定数、文字列リテラル、区切り子、ヘッダ名、前処理数、注釈などがある。<ref>『JISX3010:2003』p.35「6.4 字句要素」</ref>
<ref>『JISX3010:2003』p.35「6.4 字句要素」</ref>
 
字句とはC言語の最小の字句的な単位である。
字句には、キーワード、識別子、国際文字名、定数、文字列リテラル、区切り子、ヘッダ名、前処理数、注釈などがある。
 
=== キーワード ===
<pre>
ここでは個々のキーワードの機能については説明しません。
詳細はリンク先を参照してください。
各キーワードのページが完成次第、ここからもリンクを張る予定です。
</pre>
 
キーワードとは特定の機能のために予約された字句であり、その他の機能のためには使用できない。キーワードとは次のいずれかである。
<ref>『JISX3010:2003』p.37「6.4.1 キーワード」</ref>
キーワードとは特定の機能のために予約された字句であり、
その他の機能のためには使用できない。
キーワードとは次のいずれかである。
 
{|class="wikitable"
|-
109 ⟶ 87行目:
|-
|}
<ref>『JISX3010:2003』p.37「6.4.1 キーワード」</ref>
 
=== 識別子 ===
識別子とは、1つ又はそれ以上の実体を指し示すもので、オブジェクト、関数、構造体・共用体・列挙体のタグまたはメンバ、型定義名、ラベル名、マクロ名、マクロ仮引数のいずれか一つを表す。<ref>『JISX3010:2003』p.21「6.2.1 識別子の有効範囲」</ref>
<ref>『JISX3010:2003』p.37「6.4.2 識別子」</ref>
 
識別子は、半角英数、「_(下線)」からなる文字列である。ただし、先頭は非数字でなければならない。識別子に多バイト文字を使用できるかはコンパイラによる。<ref>『JISX3010:2003』p.37「6.4.2 識別子」</ref>
識別子とは、1つ又はそれ以上の実体を指し示すもので、
オブジェクト、関数、構造体・共用体・列挙体のタグまたはメンバ、型定義名、ラベル名、マクロ名、マクロ仮引数のいずれか一つを表す。
識別子は、半角英数、「_(下線)」からなる文字列である。
ただし、先頭は非数字でなければならない。
識別子に多バイト文字を使用できるかはコンパイラによる。
 
==== __func__ ====
識別子__func__は、コンパイラによって暗黙に宣言され、関数名の文字列としてデバッグなどで使用できる。<ref>『JISX3010:2003』p.38「6.4.2.2 あらかじめ定義された識別子」</ref>
 
識別子__func__は、コンパイラによって暗黙に宣言され、
関数名の文字列としてデバッグなどで使用できる。
 
<source lang=c>
137 ⟶ 108行目:
 
=== 国際文字名 ===
国際文字名とは、ISO 10646 文字集合の文字を 16 進数で直接記述してしまおうという仕様である。<ref>『[迷信] 識別子に使える文字は英数字と下線のみ | 株式会社きじねこ』http://www.kijineko.co.jp/tech/superstitions/only-alnums-and-underscore-are-usable-for-identifier.html</ref>
<ref>『JISX3010:2003』p.39「6.4.3 国際文字名」</ref>
 
国際文字名とは、ISO 10646 文字集合の文字を 16 進数で直接記述してしまおうという仕様である。
<ref>『[迷信] 識別子に使える文字は英数字と下線のみ | 株式会社きじねこ』http://www.kijineko.co.jp/tech/superstitions/only-alnums-and-underscore-are-usable-for-identifier.html</ref>
 
国際文字名の記述は次のようになっている。
147 ⟶ 115行目:
\Unnnnnnnn
</source>
nは16進数字。国際文字名は、次に示す短い識別子を持つ文字を指定してはならない。
nは16進数字。
00A0未満[0024($)0040(@)及び0060(`)を除く]、D800~DF00。国際文字名は、基本文字集合にない文字を表すために、識別子、文字定数、及び文字列リテラルの中で使用できる。国際文字名\Unnnnnnnnは8桁の短い識別子がnnnnnnnnである文字を表す。国際文字名\unnnnは4桁の短い識別子がnnnnである文字を表す(この文字の8桁の短い識別子は、0000nnnnである。)。国際文字名の識別子はISO/IEC 10646で規定されている。<ref>『JISX3010:2003』p.39「6.4.3 国際文字名」</ref>
国際文字名は、次に示す短い識別子を持つ文字を指定してはならない。
00A0未満[0024($)0040(@)及び0060(`)を除く]、D800~DF00。
 
国際文字名は、基本文字集合にない文字を表すために、識別子、文字定数、及び文字列リテラルの中で使用できる。
 
国際文字名\Unnnnnnnnは8桁の短い識別子がnnnnnnnnである文字を表す。
国際文字名\unnnnは4桁の短い識別子がnnnnである文字を表す
(この文字の8桁の短い識別子は、0000nnnnである。)。
 
国際文字名の識別子はISO/IEC 10646で規定されている。
 
=== 定数 ===
定数とはプログラム実行時に一定の値しかもたない数である。変数の値がプログラム実行中に変更される場合もあるのに対して、定数の値はプログラム実行中を通して一定である。ソースコード中で直接に記述された定数を特にリテラルとも呼ぶ。ここではそのリテラルについて説明する。
<ref>『JISX3010:2003』p.39「6.4.4 定数」</ref>
<ref>『JISX3010:2003』p.45「6.4.5 文字列リテラル」</ref>
 
定数とはプログラム実行時に一定の値しかもたない数である。
変数の値がプログラム実行中に変更される場合もあるのに対して、
定数の値はプログラム実行中を通して一定である。
ソースコード中で直接に記述された定数を特にリテラルとも呼ぶ。
ここではそのリテラルについて説明する。
 
【下の表を参照しつつ読むこと】定数には整数定数、浮動小数点定数、文字定数、文字列定数、などがある。
173 ⟶ 125行目:
浮動小数点定数とは浮動小数点数を記述するための定数である。主に10進数の小数点数表記で記述するが、必要に応じて有効数字部と指数部で記述することもある。
文字定数とは1バイト文字を記述するための定数である。半角英数記号や半角カタカナなどが記述できる。
文字列定数(文字列リテラル)とは1バイト文字または多バイト文字の文字列を記述するための定数である。C言語では文字列は文字の配列として扱われるが、ここではこれ以上説明しない。
 
*次に主な定数を表にまとめた。
194 ⟶ 146行目:
|-
|}
<ref>『JISX3010:2003』p.39「6.4.4 定数」</ref>
 
<ref>『JISX3010:2003』p.45「6.4.5 文字列リテラル」</ref>
<ref>『知ってた?8進数のナゾ:Alternative 笑門来福:ITmedia オルタナティブ・ブログ』http://blogs.itmedia.co.jp/pina/2006/06/8_bf7b.html</ref>
 
*整数定数の接尾語
整数定数に接尾語を付けることで、その型を指定することができる。整数定数の型は、次の表の対応する並びの中で、その値を表現できる最初の型である。
整数定数の型は、次の表の対応する並びの中で、その値を表現できる最初の型である。
{|class="wikitable"
!接尾語!!10進定数!!8進定数又は16進定数
215 ⟶ 167行目:
|u又はU及びll又はLLの両方||unsigned long long int||unsigned long long int
|}
<ref>『JISX3010:2003』p.39「6.4.4.1 整数定数」</ref>
 
*浮動小数点定数の接尾語
浮動小数点定数に接尾語を付けることで、その型を指定することができる。
浮動小数点定数の型は、接尾語なしで型double、接尾語f又はFで型float、l又はLで型long doubleである。
<ref>『JISX3010:2003』p.41「6.4.4.2 浮動小数点定数」</ref>
 
<source lang=c>
241 ⟶ 195行目:
 
=== 区切り子 ===
<pre>
<ref>『JISX3010:2003』p.46「6.4.6 区切り子」</ref>
ここでは個々の区切り子の機能については説明しません。
各キーワードのページが完成次第、ここからもリンクを張る予定です。
</pre>
 
区切り子とは次のいずれかである。
253 ⟶ 210行目:
<: :> <% %> %: %:%:
</pre>
区切り子とは、独立した構文的及び意味的な機能を持つ記号である。何らかの操作を行うとき、それを演算子と呼ぶ。また演算子が操作を行う対象をオペランドと呼ぶ
何らかの操作を行うとき、それを演算子と呼ぶ。
また演算子が操作を行う対象をオペランドと呼ぶ。
 
次の6つの2文字の字句は、2文字表記と呼ばれる。
265 ⟶ 220行目:
[ ] { } # ##
</pre>
<ref>『JISX3010:2003』p.46「6.4.6 区切り子」</ref>
 
=== ヘッダ名 ===
<ref>『JISX3010:2003』p.46「6.4.7 ヘッダ名」</ref>
 
ヘッダ名の記述は次のようになっている。
<pre>
274 ⟶ 228行目:
"文字列"
</pre>
ヘッダ名とは、#include前処理指令で読み込まれるファイル名を指す。ヘッダ名には「'、\、"、//、/*」は指定できない。<ref>『JISX3010:2003』p.46「6.4.7 ヘッダ名」</ref>
ヘッダ名には「'、\、"、//、/*」は指定できない。
 
&#x23;include前処理指令については、[[C言語/前処理指令#ソースファイル取り込み]]を参照せよ。
 
=== 前処理数 ===
<ref>『JISX3010:2003』p.47「6.4.8 前処理数」</ref>
 
前処理数の記述は次のようになっている。
 
前処理数の記述は次のようになっている。なお、ここでは『JISX3010:2003』の構文規則をそのまま引用している。<ref>『JISX3010:2003』p.21「6.1 記法」</ref>
 
構文規則
<pre>
前処理数
297 ⟶ 250行目:
前処理数 .
</pre>
前処理数は、省略可能なピリオド(.)をもつ数字で始まる。その後ろに正しい識別子用文字及び文字の並びe+、e-、E+、E-、p+、p-、P+、P-が続いてもよい。前処理数字句は、字句的に全ての浮動小数点定数字句及び整数定数字句を含む。<ref>『JISX3010:2003』p.47「6.4.8 前処理数」</ref>
 
前処理数とは、整数か浮動小数点数かを区別するまえの大雑把な解析によって得られた字句のこと。<ref>『第10回 翻訳フェーズ | 株式会社きじねこ』http://www.kijineko.co.jp/tech/creintro/translation-phases.html</ref>
前処理数は、省略可能なピリオド(.)をもつ数字で始まる。
その後ろに正しい識別子用文字及び文字の並びe+、e-、E+、E-、p+、p-、P+、P-が続いてもよい。
前処理数字句は、字句的に全ての浮動小数点定数字句及び整数定数字句を含む。
前処理数とは、整数か浮動小数点数かを区別するまえの大雑把な解析によって得られた字句のこと。
<ref>『第10回 翻訳フェーズ | 株式会社きじねこ』http://www.kijineko.co.jp/tech/creintro/translation-phases.html</ref>
 
=== 注釈 ===
注釈(コメント)の記述は次のようになっている。
<ref>『JISX3010:2003』p.48「6.4.9 注釈」</ref>
 
注釈の記述は次のようになっている。
<source lang=c>
//注釈の例1
/*注釈の例2*/
</source>
注釈とはプログラマの覚え書きとしての単なるメモで、プログラムの処理とは一切関係はない。他人の書いたコードや自分が昔書いたコードを注釈なしに理解することは困難であるため、適度な注釈はコードの理解を高めます。
プログラムの処理とは一切関係はない。
C言語では2種類の注釈表記方法があり、
「//」から行の終わりまで、または「/*」と「*/」とで囲まれた文章が注釈である。なお、昔は/* 〜 */までが正式なコメントで//はコンパイラによって独自に実装されていたが、現在は公式の仕様である。
 
C言語では2種類の注釈表記方法があり、「//」から行の終わりまで、または「/*」と「*/」とで囲まれた文章が注釈である。<ref>『JISX3010:2003』p.48「6.4.9 注釈」</ref>
他人の書いたコードや自分が昔書いたコードを注釈なしに理解することは困難であるため、適度な注釈はコードの理解を高めます。
 
なお、昔は「/*」と「*/」が正式な注釈で、「//」はコンパイラによって独自に実装されていたが、現在は公式の仕様である。<ref>『C言語の最新事情を知る: C99の仕様 - Build Insider』http://www.buildinsider.net/language/clang/01</ref>
 
== 文 ==
<ref>『JISX3010:2003』p.99「6.8 文及びブロック」</ref>
 
<source lang=c>
/*いくつかの字句*/;//「;(セミコロン)」で終わる
</source>
文とは実行すべき動作を記述したものであり、空白類(空白、水平タブ、改行、垂直タブ、書式送り)で分けられたいくつかの字句からなり、「;(セミコロン)」で終わる。文は基本的に上から下へ順番に実行される。<ref>『JISX3010:2003』p.99「6.8 文及びブロック」</ref>
文とは実行すべき動作を記述したものであり、
空白類(空白、水平タブ、改行、垂直タブ、書式送り)で分けられたいくつかの字句からなり、「;(セミコロン)」で終わる。
文は基本的に上から下へ順番に実行される。
 
== ブロック ==
<ref>『JISX3010:2003』p.99「6.8 文及びブロック」</ref>
 
<source lang=c>
{//ブロックの始まり
340 ⟶ 281行目:
}//ブロックの終わり
</source>
ブロックとはいくつかの文を1つの構造的な単位にまとめたものである。<ref>『JISX3010:2003』p.99「6.8 文及びブロック」</ref>
 
== 脚注 ==
<references/>
 
== 参考文献 ==
*日本工業標準調査会『JISX3010 プログラム言語C』2003年12月20日改正
 
[[Category:C言語|きほう]]