カンマは区切り、セミコロンは文の終りに使います。
次の使用例で、納得されると思います。
for (i=0, j=0, flag=false; i<10 && !flag; ++i, ++j) {
<snip>
}
とか
int array[10];
for (i=0; i<10; array[i++]=0);
--
(株)MMCコンピュータリサーチ 岩瀬雅人
Neznaikaさんの<kodomo-1501...@ppp319.kek.jp>から
>printf("%d",a) ではカンマなのに for(i=1;i<10;i++)では
>どうしてセミコロンなのでしょう?
for (i=1; i<10; i++) でセミコロンを使うのは、岩瀬さんも
指摘している通り「カンマ演算子を使うため」でしょう。
では何故 printf("%d", a) ではセミコロンではなく、カンマ
なのかというと、ほとんど理由はありません。(英語の影響によ
り)幾つかのものを並べる時にはカンマを使う方が自然なので
しょう。
因みに「引数区切りのカンマ」と「カンマ演算子」とは異なり
ますし、「forのセパレータとしてのセミコロン」と「文末記号
としてのセミコロン」も異なるものです。
引数区切りとしてのカンマ:
printf("%d", a);
~
カンマ演算子としてのカンマ:
for (i=0, j=0, flag=false; i<10 && !flag; ++i, ++j)
~ ~ ~
forのセパレータとしてのセミコロン:
for (i=1; i<10; i++)
~ ~
文末記号としてのセミコロン:
printf("%d", a);
~
たまたま、C言語を設計した人は、
引数区切りの記号 を カンマ(,) で
カンマ演算子の記号 を カンマ(,) で
for のセパレータ記号 を セミコロン(;) で
文末記号 を セミコロン(;) で
表わすことにしただけです。実際、引数区切りの記号がパーセン
ト記号(%)で、forのセパレータ記号がコロン(:)であったとしても
問題なかったのです。
>for(i=1;i<10;i++)では
(中略)
>最後のi++にはどうして
>セミコロンがいらないのでしょう?つけなくても区別できる
>からなら{}の中でも最後なら省略出来そうなものですが。
セパレータ(区切り)記号とターミネータ(末尾)記号の違い
のせいです。
セパレータ記号としてのパーセント記号(%):
A % B % C /* A, B, C それぞれの間に記号が必要 */
ターミネータ記号としてのパーセント記号(%):
A% B% C% /* A, B, C それぞれの終端に記号が必要 */
forはセパレータ式なのに文はターミネータ式なのも、C言語の
設計者のセンスで、必然性は全くありません。Pascalだと文はセ
パレータ方式なので、{}の中の最後の文はセミコロンを省略でき
ます。(正確には、ちょっと違いますけど。)
椎野 裕樹 yu...@cds.ne.jp
なるほど。ありがとうございます。セミコロン(;)は文末
カンマ(,)はセパレータは単純すぎる決めつけだったわけですか。
岩瀬さんの示して下さった例のようにカンマ演算子を使う場合
のためにこういった使い分けが必要になるのですね。