ブロックの意味について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ディエナ

ブロックの意味について

#1

投稿記事 by ディエナ » 11年前

コード:

 
#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のあとに
ブロックがあるんですが
これって何の意味があるんですか?
いや、普通にその中のものはその中でしか見えないよってのはわかるんですが
どういうときに使ったりするんですか?
あと、ブロックについての定義もそこまで教わってません。だれか詳しく回答お願いします。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: ブロックの意味について

#2

投稿記事 by みけCAT » 11年前

ディエナ さんが書きました:あと、ブロックについての定義もそこまで教わってません。だれか詳しく回答お願いします。
ブロックの定義は、"The C89 Draft"の3.6.2 Compound statement, or blockに載っています。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

かずま

Re: ブロックの意味について

#3

投稿記事 by かずま » 11年前

ディエナ さんが書きました: どういうときに使ったりするんですか?

コード:

#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++ は、宣言が宣言文として文に含まれるので次のようになっています。

コード:

複合文:
    { 文の並び(省略可) }

文の並び:
    文
    文の並び  文

much

Re: ブロックの意味について

#4

投稿記事 by much » 11年前

ディエナ さんが書きました: 普通にその中のものはその中でしか見えないよってのはわかるんですが
うん,それだけ.
もっと言えばスコープ内( { } の中身)が優先される
その中でしか見えない→同じ変数があってもぶつからない
ディエナ さんが書きました:

コード:

 
#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;
とかで解決しちゃうんだけどね

閉鎖

“C言語何でも質問掲示板” へ戻る