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

削除された内容 追加された内容
Ef3 (トーク | 投稿記録)
→‎定数: →‎文字リテラル: 定数とリテラルを混同している編集を修正。
タグ: 2017年版ソースエディター
Ef3 (トーク | 投稿記録)
→‎文: BNFを併記
タグ: 2017年版ソースエディター
395 行
 
== 文 ==
文( ''Statements'' )は<ref name="jtc1-sc22-wg14-n1570-6.8">{{cite book
文の記述は次のようになっている。
| url = http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf
:<syntaxhighlight lang=c>
| title = N1570 Committee Draft — April 12, 2011 ISO/IEC 9899:201x
/*いくつかの字句*/;//「;(セミコロン)」で終わる
| page = 146, §6.8 ''Statements and blocks''
| publisher = ISO/IEC}}</ref><ref name="文及びブロック">『JISX3010:2003』p.99「6.8 文及びブロック」</ref>、[[#ラベル付き文|ラベル付き文]]、[[#複合文|複合文]]、[[#式文|式文]]、[[#選択文|選択文]]、[[#繰返し文|繰返し文]]、[[#分岐文|分岐文]]のいずれかです(宣言( ''declaration'' )は文ではありません)。
 
;構文
:<syntaxhighlight lang=BNF>
statement ::= labeled-statement
| compound-statement
| expression-statement
| selection-statement
| iteration-statement
| jump-statement
</syntaxhighlight>
 
文とは実行すべき動作を記述したものであり、空白類(空白、水平タブ、改行、垂直タブ、書式送り)で分けられたいくつかの字句からなり、「;(セミコロン)」で終わる。
=== ラベル付き文 ===
文は基本的に上から下へ順番に実行される<ref name="文及びブロック">『JISX3010:2003』p.99「6.8 文及びブロック」</ref>。
ラベル付き文( ''Labeled statements'' )は、goto 文の飛び先としてのラベルの他、swicth文の case節 及び default節を含みます<ref name="jtc1-sc22-wg14-n1570-6.8.1">{{cite book
| url = http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf
| title = N1570 Committee Draft — April 12, 2011 ISO/IEC 9899:201x
| page = 146, §6.8.1 ''Labeled statements''
| publisher = ISO/IEC}}</ref>。
すべてのステートメントの前には、識別子をラベル名として宣言するプレフィックスを付けることができます。
ラベルはそれ自体、制御の流れを変えるものではなく、ラベルを越えても制御の流れは妨げられません。
 
;構文
:<syntaxhighlight lang=BNF>
labeled-statement ::= identifier : statement
| case constant-expression : statement
| default : statement
</syntaxhighlight>
 
=== 複合文 ===
複合文( ''Compound statement'' )は、ブロックのことです。 { と } の間に任意個の宣言と文を含むことが出来ます。
<ref name="jtc1-sc22-wg14-n1570-6.8.2">{{cite book
| url = http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf
| title = N1570 Committee Draft — April 12, 2011 ISO/IEC 9899:201x
| page = 147, §6.8.2 ''Compound statement''
| publisher = ISO/IEC}}</ref>。
C89までのブロックの前方に宣言、後方に文を置く制限はC99でなくなり、([[C++]]のように)文より後に宣言を置くことも可能になりました。
 
;構文
:<syntaxhighlight lang=BNF>
compound-statement ::= { [block-item-list] }
 
block-item-list ::= block-item
| block-item-list block-item
 
block-item ::= declaration
| statement
</syntaxhighlight>
 
 
=== 式文 ===
式文( ''Expression and null statements'' )の中の式は、その副作用としてvoid式として評価されます
<ref name="jtc1-sc22-wg14-n1570-6.8.4">{{cite book
| url = http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf
| title = N1570 Committee Draft — April 12, 2011 ISO/IEC 9899:201x
| page = 147, §6.8.3 ''Expression and null statements''
| publisher = ISO/IEC}}</ref>。
セミコロンだけで構成される文(null文)は、何の処理も行いません。
 
;構文
:<syntaxhighlight lang=BNF>
expression-statement ::= [expression] ;
</syntaxhighlight>
 
=== 選択文 ===
選択文( ''Selection statements'' ) は、制御式の値に応じて、一連の文の中から選択します
<ref name="jtc1-sc22-wg14-n1570-6.8.4">{{cite book
| url = http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf
| title = N1570 Committee Draft — April 12, 2011 ISO/IEC 9899:201x
| page = 148, §6.8.4 ''Selection statements''
| publisher = ISO/IEC}}</ref>。
選択文は、そのスコープが周囲のブロックのスコープの厳密なサブセットであるブロックです。
関連するサブステートメントもまた、選択ステートメントのスコープの厳密なサブセットをスコープとするブロックです。
 
;構文
:<syntaxhighlight lang=BNF>
selection-statement ::= if ( expression ) statement
| if ( expression ) statement else statement
| switch ( expression ) statement
</syntaxhighlight>
 
==== if 文 ====
==== swicth 文 ====
 
=== 繰返し文 ===
繰返し文( ''Iteration statements''、反復文とも)の制御式は、スカラー型でなければなりません
<ref name="jtc1-sc22-wg14-n1570-6.8.4">{{cite book
| url = http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf
| title = N1570 Committee Draft — April 12, 2011 ISO/IEC 9899:201x
| page = 150, §6.8.4 ''Selection statements''
| publisher = ISO/IEC}}</ref>。
for文の宣言部では、記憶クラスが auto または register であるオブジェクトの識別子のみ宣言が可能です。
繰返し文は、ループ本体と呼ばれる文を、制御式の比較が0になるまで繰り返し実行させます。
繰り返しは、ループ本体が繰返し文から入力されたか、ジャンプで入力されたかにかかわらず発生します。
繰返し文のブロックのスコープは、そのブロックを囲むブロックのスコープの厳密なサブセットであるブロックです。
ループ本体もまた、繰返し文のスコープの厳密なサブセットであるブロックです。
 
;構文
:<syntaxhighlight lang=BNF>
iteration-statement ::= while ( expression ) statement
| do statement while ( expression ) ;
| for ( [expression] ; [expression] ; [expression] ) statement
| for ( declaration [expression] ; [expression] ) statement
</syntaxhighlight>
 
==== while 文 ====
==== do 文 ====
==== for 文 ====
 
=== 分岐文 ===
分岐文( ''Jump statements'' )は、無条件で別の場所にジャンプします
<ref name="jtc1-sc22-wg14-n1570-6.8.6">{{cite book
| url = http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf
| title = N1570 Committee Draft — April 12, 2011 ISO/IEC 9899:201x
| page = 151, §6.8.6 ''Jump statements''
| publisher = ISO/IEC}}</ref>。
 
;構文
:<syntaxhighlight lang=BNF>
jump-statement ::= goto identifier ;
| continue ;
| break ;
| return [expression] ;
</syntaxhighlight>
 
==== goto 文 ====
==== continue 文 ====
==== break 文 ====
==== return 文 ====
 
== ブロック ==