C言語関係掲示板

過去ログ

No.498.for文の後ろにセミコロンを付けると

[戻る] [ホームページ]
No.3695

for(;;);とfor(;;)
投稿者---tas(2002/12/03 10:51:22)


こんにちわ。tasです。
いつも一方的にお世話になっております。

今回の質問は、題名の通りなのですが、
あやまって、下記のソースでfor文の後ろにセミコロンを入れたところ、

#include <stdio.h>
#define	MAX	5
int main(void)
{
  int	i;
  for( i = 0 ; i <= MAX ; i ++ );
  {
	  printf("%d	",i);
  }
  printf("\n");
  return 0;
}


結果が、 6 と表示されました。

コンパイル時に、エラーは全く出ていなかったので、
始めはなぜ6が表示されているのか見つけるのに苦労しました。

で、なぜ6が表示されることになったのか
デバッグモードで確かめたのですが、よくわかりません。
どなたかわかる方がいらっしゃいましたら、ご教授宜しくお願い致します。

環境は、Windows2000 VC++6.0を使用しています。

No.3699

Re:for(;;);とfor(;;)
投稿者---GG(2002/12/03 14:28:47)


はじめまして。
for(;;);
となっていることからforが空文で周り
iが6回インクリメントされてからの
出力だからだと思います。


No.3701

Re:for(;;);とfor(;;)
投稿者---aki(2002/12/03 15:41:17)


「式」の後ろに ; を書くとそれは「式文」になります。式文は文の一種です。

例えば x = n + j という式の後ろに ; を付けた、x = n + j; は式文です。
また、; 単独でも式文とみなされます。これは何もしない文で、これを特に
空文(null statement)といいます。式文の例を挙げてみます。

s++;           /* 式文 */
i = j = 2;     /* 式文 */
i = 2, j = 2;  /* 式文 */
f();           /* 式文 */
3;             /* 式文 */
;              /* 式文(空文) */

次に、{ } の中に任意の個数の宣言に続き、任意の個数の文を並べたもの
を複合文(ブロック文)といいます。複合文の例を挙げます。

{ int i; int j; i = j = 2; s++; }  /* 複合文 (2個の宣言と2個の文) */
{ int i; }                         /* 複合文 (1個の宣言と0個の文) */
{ f(); ; }                         /* 複合文 (0個の宣言と2個の文) */
{ ;;;;;; }                         /* 複合文 (0個の宣言と6個の文) */
{ }                                /* 複合文 (0個の宣言と0個の文) */

複合文は文の一種なのでそれを{ }の中に並べたものも複合文になります。

{ int i; i = 1; { f(); ; } }       /* 複合文 (1個の宣言と2個の文) */
{ {;;} ;;; {} {} {;{}} }           /* 複合文 (0個の宣言と7個の文) */

関数本体を囲んでいる{ }は実は複合文です。

void f(void) { {;;} ;;; {} {} {;} }  /* 何もしない関数 */

次に、for (式;式;式) に続いて文を置くと、それはfor文という文になります。
式は3つとも省略できます。for文の例を挙げます。

/* for文 (for (式;式;式) の後ろに複合文) */
for (i = 0; i < 10; i++) { int j; j = i * i; f(); }

/* for文 (for (式;式;式) の後ろに複合文) */
for (i = 0; i < 10; i++) { }

/* for文 (for (式;式;式) の後ろに式文) */
for (;;) i++;

/* for文 (for (式;式;式) の後ろに式文) */
for (;;) ;

for文は文の一種なので、for (式;式;式) の後ろに置く文として使えますし、
複合文の中に置く文としても使えます。

/* for文 (for (式;式;式) の後ろにfor文) */
for (i = 0; i < 10; i++) for (j = i + 1; j < 10; j++) ;

/* 複合文 (1個の宣言と2個の文) */
{ int x; for (;;){;;;}  for(;;)for(;;)for(;;); }

文にはこの他にもif文やwhile文、switch文や名札つき文などがあり、
これらは文の一種なので、上の例の任意の文と置き換えることが可能
です。

疲れたのでこの辺で終わりにします。


No.3703

空文実行後の表示ということですか?
投稿者---tas(2002/12/03 19:08:42)


お二方、どうもありがとうございました。
読解能力不足で申し訳ないのですが、
確認のため、再度お伺いします。

> 「式」の後ろに ; を書くとそれは「式文」になります。式文は文の一種です。
> また、; 単独でも式文とみなされます。これは何もしない文で、
> これを特に空文(null statement)といいます。式文の例を挙げてみます。

つまり、for文は、MAX値までiをインクリメントをするけれども、
すぐ後ろの空文が実行されて、forループを抜けた後のiの値、
すなわち、6が表示された、という理解でよろしかったでしょうか。

No.3706

Re:空文実行後の表示ということですか?
投稿者---aki(2002/12/04 05:28:55)


>つまり、for文は、MAX値までiをインクリメントをするけれども、
>すぐ後ろの空文が実行されて、forループを抜けた後のiの値、
>すなわち、6が表示された、という理解でよろしかったでしょうか。

はい、そういうことです。

#include <stdio.h>
#define	MAX	5
int main(void)
{
  int    i;
  for( i = 0 ; i <= MAX ; i ++ )
    ;  /* { }と同じ */
  { printf("%d	",i); }
  printf("\n");
  return 0;
}


No.3707

ありがとうございました
投稿者---tas(2002/12/04 09:00:02)


> はい、そういうことです。

ソースまで書いていただいて、
ご丁寧にありがとうございました。

また、何かのときは宜しくお願い致します。