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

削除された内容 追加された内容
Ef3 (トーク | 投稿記録)
→‎3文字表記: C99とC11の差異
タグ: 2017年版ソースエディター
Ef3 (トーク | 投稿記録)
cleanup、s/文字列定数/文字列リテラル/、JISCの参照先が間違っていて偽出典化していたのを修正。
タグ: 2017年版ソースエディター
1 行
このページでは、C言語の記法に関する情報を網羅するよう心掛けましが、
「3文字表記」、「国際文字名」、「前処理数」については読み飛ばしてもかまわないだろう。
 
== 文字集合 ==
121 ⟶ 120行目:
== 字句 ==
字句とはC言語の最小の字句的な単位である。
字句には、キーワード、識別子、国際文字名、定数、文字列リテラル、区切り子、ヘッダ名、前処理数、注釈などがある<ref>『JISX3010:2003』p.35「6.4 字句要素」</ref>
<ref>『JISX3010:2003』p.35「6.4 字句要素」</ref>
 
=== キーワード ===
134 ⟶ 132行目:
=== 識別子 ===
識別子とは、1つ又はそれ以上の実体を指し示すもので、<ref name="識別子">『JISX3010:2003』p.37「6.4.2 識別子」</ref>
オブジェクト、関数、構造体・共用体・列挙体のタグまたはメンバ、型定義名、ラベル名、マクロ名、マクロ仮引数のいずれか一つを表す<ref>『JISX3010:2003』p.21「6.2.1 識別子の有効範囲」</ref>
 
識別子は、半角英数、「_(下線)」からなる文字列である。
ただし、先頭は非数字でなければならない。
識別子に多バイト文字を使用できるかはコンパイラによる<ref name="識別子"/>
 
==== __func__ ====
162 ⟶ 160行目:
 
=== 国際文字名 ===
ISO/IEC 9899:2011(通称 C11)の §6.4.3 ''Universal character names''(JIS Cでは国際文字名と和訳) の冒頭を抄訳/引用します<ref name="jtc1-sc22-wg14-n1570-6.4.3">{{cite book
国際文字名とは、ISO 10646 文字集合の文字を 16 進数で直接記述してしまおうという仕様である。<ref>『[迷信] 識別子に使える文字は英数字と下線のみ | 株式会社きじねこ』http://www.kijineko.co.jp/tech/superstitions/only-alnums-and-underscore-are-usable-for-identifier.html</ref>
| url = http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf
| title = C11: WG14/N1570 Committee Draft — April 12, 2011 ISO/IEC 9899:201x
| page=61, §6.4.3 ''Universal character names''
| publisher = ISO/IEC}}</ref>。
<blockquote class="toccolours" cite="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf">
 
; 構文
国際文字名の記述は次のようになっている。
:: <sourcesyntaxhighlight lang=cBNF>
universal-character-name:
\unnnn
\u hex-quad
\Unnnnnnnn
\U hex-quad hex-quad
</source>
hex-quad:
nは16進数字。国際文字名は、次に示す短い識別子を持つ文字を指定してはならない。
hexadecimal-digit hexadecimal-digit
00A0未満[0024($)0040(@)及び0060(`)を除く]、D800~DF00。
hexadecimal-digit hexadecimal-digit
国際文字名は、基本文字集合にない文字を表すために、識別子、文字定数、及び文字列リテラルの中で使用できる。
</syntaxhighlight>
国際文字名\Unnnnnnnnは8桁の短い識別子がnnnnnnnnである文字を表す。
; 制約条件
国際文字名\unnnnは4桁の短い識別子がnnnnである文字を表す(この文字の8桁の短い識別子は、0000nnnnである。)。
: 国際文字名では、短識別子が00A0未満で、0024($)、0040(@)、0060(')以外の文字、およびD800からDFFFの範囲の文字を指定してはならない。
国際文字名の識別子はISO/IEC 10646で規定されている。
; 説明
<ref>『JISX3010:2003』p.39「6.4.3 国際文字名」</ref>
: 国際文字名は、識別子、文字定数、文字列リテラルでは、基本文字セットに含まれない文字を指定するために使用することができる。
; セマンティクス
: 国際文字名 \Unnnnnnnn は、ISO/IEC 10646(訳註: UCS; Universal Coded Character Set)で規定されている8桁の短縮識別子が nnnnnnn である文字を表す。
: 国際文字名 \Unnnnnnnnunnnn 8、4 桁の短識別子がnnnnnnnn nnnn(8 桁の短縮識別子が 0000nnnn)である文字を表す。
</blockquote>
 
;[https://paiza.io/projects/GJNv87B2Zcweu1F-jZKiuQ?language=c 国際文字名の使用]
:<syntaxhighlight lang=c>
#include <stdio.h>
 
int main(void)
{
printf("\u265E\n"); // '♞'; BLACK CHESS KNIGHT
}
</syntaxhighlight>
; 結果
: <syntaxhighlight lang=text>
</syntaxhighlight>
 
=== 定数 ===
定数とはプログラム実行時に一定の値しかもたない数である。
変数の値がプログラム実行中に変更される場合もあるのに対して、定数の値はプログラム実行中を通して一定である。
ソースコード中で直接に記述された定数を特にリテラルとも呼ぶ<ref>const修飾子で修飾された複合オブジェクトの事も、複合リテラルと呼ぶ</ref>。ここではそのリテラルについて説明する。
 
【下の表を参照しつつ読むこと】定数には整数定数、浮動小数点定数、列挙定数、文字定数、文字列定数リテラル、などがある。
整数定数とは整数を記述するための定数である。主に10進数表記が使われるが、必要に応じて2進数表記や8進数表記や16進数表記が使われることもある。8進数表記では接頭辞として0bあるいは0Bを付け、8進数表記では接頭辞として0を付け、<ref>『知ってた?8進数のナゾ:Alternative 笑門来福:ITmedia オルタナティブ・ブログ』http://blogs.itmedia.co.jp/pina/2006/06/8_bf7b.html</ref>16進数表記では接頭辞として0xあるいは0Xを付ける。
浮動小数点定数とは浮動小数点数を記述するための定数である。主に10進数の小数点数表記で記述するが、必要に応じて有効数字部と指数部で記述することもある。
列挙定数についてはここでは説明しない。詳細は[[C言語/データ型と変数#enum]]を参照せよ。
文字定数とは1バイト文字を記述するための定数である。半角英数記号や半角カタカナ制御文字などが記述できる。
文字列定数(単純文字列リテラル)(character string literal)とは1バイト文字または多バイト文字の文字列を記述するための定数である。C言語では文字列は文字の配列として扱われるが、ここではこれ以上説明しない。詳細は[[C言語/文字と文字列]]を参照せよ
ワイド文字列リテラル(wide string literal)は,文字Lという接頭語をもつことを除いて,単純文字列リテラルと同一である。
C言語では文字列は(NULL文字で終端された)文字の配列として扱われるが、ここではこれ以上説明しない。詳細は[[C言語/文字と文字列]]を参照せよ。
 
*次に主な定数を表にまとめた。
{|class="wikitable"
|+ 定数の種類と記法
!定数の種類!!進数!!記法!!例
|-
|rowspan="34"|整数定数||82進数||「00b」あるいは「0B」に続く82進数||02322<ref //name="jtc1-sc22-wg14-n2596-6.4.4.1">{{cite book 10進数で1234のこと
| url=http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2596.pdf
| title= N2596 working draft — December 11, 2020 ISO/IEC 9899:202x (E)
| page=51, §6.4.4.1 Integer constants
| publisher = [http://www.open-std.org/jtc1/sc22/wg14/www/projects ISO/IEC JTC1/SC22/WG14]}}</ref>||0b10011010010 // 10進数で1234のこと
|-
<!--||-->|8進数||「0」に続く8進数<ref>『JISX3010:2003』p.39「6.4.4 定数」</ref>||02322 // 10進数で1234のこと
|-
<!--||-->|10進数||10進数||1234
|-
<!--||-->|16進数||「0x」あるいは「0X」に続く16進数||0x4d2 // 10進数で1234のこと
|-
|rowspan="2"|浮動小数点定数||10進数||10進整数部と「.」と10進小数部<br>10進有効数字部と「e」と10進指数部(10のべき乗)|| 3.14<br>1e-3 // 0.001のこと
|-
<!--||-->|16進数||「0x」あるいは「0X」に続く16進整数部と「.」と16進小数部と「p」と10進指数部(2のべき乗)<brhr>「0x」あるいは「0X」に続く16進有効数字部と「p」と10進指数部(2のべき乗)||0x1.91eb851eb851fp+1//3.14
|-
|文字定数|| - ||「'(一重引用符)」で囲まれた文字(単純文字定数)<brhr>「L」に続く「'(一重引用符)」で囲まれた文字(ワイド文字定数)||'a'<brhr>L'a'
|-
|文字列定数リテラル|| - ||「"(二重引用符)」で囲まれた文字列(単純文字列リテラル;''character string literal'')<BRref>『JISX3010:2003』p.45「6.4.5 文字列リテラル」</ref><hr>「L」に続く「"(二重引用符)」で囲まれた文字列(ワイド文字列リテラル;''wide string literal'')|| "Hello, World!"<brhr>L"Hello, World!"
|-
|}
 
<ref>『JISX3010:2003』p.39「6.4.4 定数」</ref><ref>『JISX3010:2003』p.45「6.4.5 文字列リテラル」</ref>
 
*整数定数の接尾語
231 ⟶ 262行目:
*浮動小数点定数の接尾語
浮動小数点定数に接尾語を付けることで、その型を指定することができる。
浮動小数点定数の型は、接尾語なしで型double、接尾語f又はFで型float、l又はLで型long doubleである<ref>『JISX3010:2003』p.41「6.4.4.2 浮動小数点定数」</ref>
<ref>『JISX3010:2003』p.41「6.4.4.2 浮動小数点定数」</ref>
 
<syntaxhighlight lang=c>
247 ⟶ 277行目:
c='a';//cに文字定数aを代入する。
char str[32];
strcpy(str,"Hello, World!");//strに文字列定数リテラルHello, World!をコピーする。
}
</syntaxhighlight>
302 ⟶ 332行目:
 
=== 前処理数 ===
前処理数(Preprocessing numbers; '''''Syntax'''''では ''pp-number''<ref>JIS Cでは、用語を構文規約中のシンボルに同じ語を使っているので、C99の原文を当たらないと構文について読み誤る恐れがある。</ref>)の記述は次のようになっている。
前処理数の記述は次のようになっている。
なお、ここでは以下『JISX3010:2003』から構文規則をそのまま引用している<ref>『JISX3010:2003』p.47「6.4.8 前処理数」</ref>
 
構文規則<ref>blockquote class="toccolours" cite="『JISX3010:2003』p.2147「6.14.8 記法前処理数</ref">
構文規則
<pre>
前処理数
数字
. 数字
前処理数 数字
前処理数 識別子用非数字
318 ⟶ 349行目:
前処理数 .
</pre>
; 補足説明
: 前処理数は省略可能な先行するピリオド(.)をもつ数字で始まる。
: その後ろに正しい識別子用文字及び文字の並びe+、e,e-、E,E+、E,E-、p,p+、p,p-、P,P+又はP-が続いてもよい。
: 前処理数字句は字句的にすべての浮動小数点定数字句及び整数定数字句を含む。
<ref>『JISX3010:2003』p.47「6.4.8 前処理数」</ref>
; 意味規則
 
: 前処理数は,型も値ももたない。型と値は,[翻訳フェーズ(7)で]浮動小数点定数字句又は整数定数字句に変換された結果として決まる。
前処理数とは、整数か浮動小数点数かを区別するまえの大雑把な解析によって得られた字句のこと。<ref>『第10回 翻訳フェーズ | 株式会社きじねこ』http://www.kijineko.co.jp/tech/creintro/translation-phases.html</ref>
</blockquote>
上記のように前処理数の解析は、後にくる厳格な構文解析を行うわけではなくもっぱら字句解析による。
 
=== 注釈 ===
注釈(コメント)の記述は次のようになっている。
:<sourcesyntaxhighlight lang=c>
//注釈の例1
/*注釈の例2*/
</syntaxhighlight>
</source>
注釈とはプログラマの覚え書きとしての単なるメモで、プログラムの処理とは一切関係はない。
他人の書いたコードや自分が昔書いたコードを注釈なしに理解することは困難であるため、適度な注釈はコードの理解を高めます。
 
C言語では2種類の注釈表記方法があり、「//」から行の終わりまで、または「/*」と「*/」とで囲まれた文章が注釈である<ref>『JISX3010:2003』p.48「6.4.9 注釈」</ref>
 
なお、C99以前は「/*」と「*/」だけが正式な注釈で、「//」はコンパイラによって独自に実装されていたが、現在は公式の仕様である<ref>『C言語の最新事情を知る: C99の仕様 - Build Insider』http://www.buildinsider.net/language/clang/01</ref>
 
== 文 ==
文の記述は次のようになっている。
:<sourcesyntaxhighlight lang=c>
/*いくつかの字句*/;//「;(セミコロン)」で終わる
</syntaxhighlight>
</source>
文とは実行すべき動作を記述したものであり、空白類(空白、水平タブ、改行、垂直タブ、書式送り)で分けられたいくつかの字句からなり、「;(セミコロン)」で終わる。
文は基本的に上から下へ順番に実行される<ref name="文及びブロック">『JISX3010:2003』p.99「6.8 文及びブロック」</ref>
 
== ブロック ==
ブロックの記述は次のようになっている。
:<sourcesyntaxhighlight lang=c>
{//ブロックの始まり
//文
355 ⟶ 388行目:
//...
}//ブロックの終わり
</syntaxhighlight>
</source>
ブロックとはいくつかの文を1つの構造的な単位にまとめたものである<ref name="文及びブロック"/>
 
== 脚注 ==
362 ⟶ 395行目:
 
== 参考文献 ==
*日本工業標準調査会(当時、現:日本産業標準調査会)JISX3010JIS X 3010 プログラム言語C』2003年12月20日改正
 
[[Category:C言語|きほう]]