- 締切済み
C言語における文法のうち文についての把握
C言語で文は「,」で区切るということですが、ここで言う文とは何でしょうか?具体的にどのようなものとして認識すれば よいのでしょうか?
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- nery1024
- ベストアンサー率0% (0/1)
自分もいま勉強中なのですが、簡単に説明しますね。 文とは ですが。 まずC言語のソースを書くとして、 ヘッダーファイル プログラムの内容 おしまい たぶん、お知りになりたいのは、このプログラムの内容に書くソースの事かと思うので、int main(){};←これが文です。 意味は、周りに色んな物が転がってるけど、全てはint main(){この中};に書かれた物を参照して動きます。 そして、;についてですが、C言語で使う命令文を組み合わせて何かをさせるわけですが、このint main(){この中に命令文を書きます}; 例えばコマンドプロンプトに文字を表示する際、printf("ここに表示する文字")←のような命令文があります。この最後に;を付けないとprintfが終わった事を、コンピュータが理解しないので、エラーが出て命令を実行しなくなります。 他の方の回答に;を付けなくて良い場合がありましたが、今の時点では簡単かつ明確に覚えるため、何かをさせる文を書いたら、;を付けて終わりだよって教える。と理解すれば良いかと思います。
- Yune-Kichi
- ベストアンサー率74% (465/626)
※規格上で,boldのものは'で囲っています。また,下付文字でoptとなっているものは,(opt)と表現しています。 > いちばんお聞きしたいのはこの文とは何かです。 ISO/IEC 9899:1999 (以下IS) の6.8 Statements and blocksにあるものを言います。 > statement: > labeled-statement > compound-statement > expression-statement > selection-statement > iteration-statement > jump-statement 一応,これが「文」になるもの全てです。 細かく見ていきます。 IS 6.8.1 Labeled statements > labeled-statement: > identifier ':' statement > 'case' constant-expression ':' statement > 'default' ':' statement ラベル付き文です。 一つ目がいわゆる「ラベル」,二つ目が「caseラベル」,三つ目が「defaultラベル」です。 IS 6.8.2 Compound statement > compound-statement: > '{' block-item-list(opt) '}' 複合文です。block-item-listは,以下のようになります。 > block-item-list: > block-item > block-item-list block-item > block-item: > declaration > statement declarationは文ではないので,block-itemが宣言または文という形になっています。 # C++では「宣言文」というのがあったりしますが (ISO/IEC 14882:2003 6.7 Declaration statement) IS 6.8.3 Expression and null statements > expression-statement: > expression(opt) ';' 式文または空文。副作用を発生させるという意味で,一番重要な文です。 例えば, puts("Hello, world!"); も式文になります。 IS 6.8.4 Selection statements > selection-statement: > 'if' '(' expression ')' statement > 'if' '(' expression ')' statement 'else' statement > 'switch' '(' expression ')' statement 選択文。switchの定義は不思議かもしれませんが,こういう定義になっています。 また,ifやswitchの制御式はexpressionなので,C++と違ってここで宣言を行う事はできません。 # C++でdynamic_castする場合のような,有効な利用法はないと思いますが。 IS 6.8.5 Iteration statements > iteration-statement: > 'while' '(' expression ')' statement > 'do' statement 'while' '(' expression ')' ';' > 'for' '(' expression(opt) ';' expression(opt) ';' expression(opt) ')' statement > 'for' '(' declaration expression(opt) ';' expression(opt) ')' statement 繰り返し文。4番目は for (int i = 0; i < 10; ++i) ; のようなことを許す為の定義。declarationに;が含まれるので,なんとなく不思議な文法定義になっています。 で,whileやforの制御式はexpressionなので,(以下略)。 IS 6.8.6 Jump statements > jump-statement: > 'goto' identifier ';' > 'continue' ';' > 'break' ';' > 'return' expression(opt) ';' 最後に分岐文の定義です。 文の定義自体としては;で終わるものは少ないのですが, ;で終わらないものはcompound-statementを除いて末尾がstatementになっています。 このため,;で終わらない文は実質的にcompound-statementということになります。 なお,この逆,;で終わるから文は必ずしも成り立ちません。 IS 6.7 Declarations > declaration: > declaration-specifiers init-declarator-list(opt) ';' と,宣言も;で終わる為です。
お礼
ご丁寧で詳しい解説は有難かったのですが、ちょっと今の私には難しすぎます。もうすこし理解が進んだらもう一度考えてみようかと思います。
- jacta
- ベストアンサー率26% (845/3158)
> C言語で文は「,」で区切るということですが、 , は「式」を区切ることはできても、「文」を区切ることはできません。 「文」を区切るのは原則として ; ですが、複合文の場合は ; を必要としません。なぜなら、{ から } までが複合文ですので、区切り文字がなくても文の範囲が明確だからです。
補足
早速のご回答有難うございます。ただここでどういうものを文として認識すべきなのでしょうか?ご存知でしたら教えて頂きたいことなのですが・・・
- osamuy
- ベストアンサー率42% (1231/2878)
http://www.lysator.liu.se/c/ANSI-C-grammar-y.html#statement を見た感じだと、「文は『;』で区切る」と覚えといたほうが良いような。 (正確に言うと上記yacc形式構文表記を見ると分かるとおり、『;』が「文を区切っている」わけでなくて、「文のいくつかの形式は末尾に『;』を付ける」と理解する必要があります。) > C言語で文は「,」で区切るということですが ちなみに何に書いてありました?
補足
申し訳ありません。,ではなく;であったようです。失礼しました。C言語で何が文なのか。どういうものを文と呼んでいるのかよく分からないのです。命令とは別に分けられているようですが、この言語における文の定義が今一つ分かりません。いちばんお聞きしたいのはこの文とは何かです。幾つか参考図書を見ましたが、ただいきなり文を;で区切るという記述が多いような気がします。
お礼
ご丁寧に有難うございます。なかなか入門書だけ買って読んでみても難しい部分があるような気がするのですが?・・・皆さんどのように理解していらっしゃるのかと思い思い切って質問してみました。