ページ 1 / 1
ブロックの意味について
Posted: 2014年8月15日(金) 19:55
by ディエナ
コード:
#include <stdio.h>
int main()
{
int i = 5;
{
int i = 3;
printf(" i = %d\n", i);
}
printf("i = %d\n", i);
return 0;
}
この簡単なプログラムなんですが
ブロックで
int i = 5のあとに
ブロックがあるんですが
これって何の意味があるんですか?
いや、普通にその中のものはその中でしか見えないよってのはわかるんですが
どういうときに使ったりするんですか?
あと、ブロックについての定義もそこまで教わってません。だれか詳しく回答お願いします。
Re: ブロックの意味について
Posted: 2014年8月15日(金) 20:24
by みけCAT
ディエナ さんが書きました:あと、ブロックについての定義もそこまで教わってません。だれか詳しく回答お願いします。
ブロックの定義は、"The C89 Draft"の
3.6.2 Compound statement, or blockに載っています。
Re: ブロックの意味について
Posted: 2014年8月15日(金) 22:21
by かずま
ディエナ さんが書きました:
どういうときに使ったりするんですか?
コード:
#include <stdio.h>
void func(void)
{
int i = 3;
printf(" i = %d\n", i);
}
int main(void)
{
int i = 5;
func();
printf("i = %d\n", i);
return 0;
}
このようなプログラムがあった時、
わざわざ関数を呼び出すことはないと考え、
呼び出し元に展開したとき、ブロックによる
「名前(識別子)のスコープ(有効範囲)の仕組み」がなければ、
変数名がぶつからないように変更が必要になります。
ディエナ さんが書きました:
あと、ブロックについての定義もそこまで教わってません。だれか詳しく回答お願いします。
ブロックとは複合文のことです。
C は 1999年版から規格が変わって、
それまでは、宣言を文の前に書かなければならなかったのが、
宣言と文をどういう順序で書いてもよくなりました。
C99より前
コード:
複合文:
{ 宣言の並び(省略可) 文の並び(省略可) }
宣言の並び:
宣言
宣言の並び 宣言
文の並び:
文
文の並び 文
C99以降
コード:
複合文:
{ ブロック項目の並び(省略可) }
ブロック項目の並び:
ブロック項目
ブロック項目の並び ブロック項目
ブロック項目:
宣言
文
C++ は、宣言が宣言文として文に含まれるので次のようになっています。
コード:
複合文:
{ 文の並び(省略可) }
文の並び:
文
文の並び 文
Re: ブロックの意味について
Posted: 2014年8月24日(日) 01:05
by much
ディエナ さんが書きました:
普通にその中のものはその中でしか見えないよってのはわかるんですが
うん,それだけ.
もっと言えばスコープ内( { } の中身)が優先される
その中でしか見えない→同じ変数があってもぶつからない
ディエナ さんが書きました:コード:
#include <stdio.h>
int main()
{
int i = 5;
{
int i = 3;
printf(" i = %d\n", i);
}
printf("i = %d\n", i);
return 0;
}
上の例だと
i = 3
i = 5
ですが
コード:
#include <stdio.h>
int main()
{
int i = 5;
i = 3; //int i = 3 と書くのは変数の再定義となるのでNG
printf(" i = %d\n", i);
printf("i = %d\n", i);
return 0;
}
は
i = 3
i = 3
です
グローバル変数(プログラム中のどこでも使える変数)ばっか置いていると
大きなプログラムとか書いていると
気づかぬうちに値がぶつかったりとか
思いもよらぬところからデータが抜き出されたり加工されちゃったりします
(メモリの中を覗いてみると・・・)
なので変数は使用範囲をなるべく狭めておくというのが基本なのです
ぶっちゃけ動けばいいんなら
int i1 = 5;
int i2 = 3;
とかで解決しちゃうんだけどね