変数のスコープなんですけど

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

変数のスコープなんですけど

#1

投稿記事 by まだ » 18年前

早速ですが
例えば、
for(int j; j<N; j++){
.....;
}

のような文で、loop変数jの定義はいったいforの中にあるとみなすべきか
for文の外にあるとみなすべきでしょうか。
あるいはどっかの設定(コンパイラ環境)に決めるもんでしょうか。
時々変わるような感じで、どういうわけでしょうか。
CとC++とは違う?
C++であっても、バージョーンにもよる?

頭混乱してます。

ご教授お願い致します

Hermit

Re:変数のスコープなんですけど

#2

投稿記事 by Hermit » 18年前

C++ では、昔は for の外でしたが、
現在は、for の中の様です。
確か、ANSI だったかの変更があってから変わったはずです。
どの時点だったかは忘れましたが、BC++ Ver5.5.1 でも中だけなので、だいぶ昔の事の様です。
#include <stdio.h>

int main()
{
    for (int i = 0; i < 10; i++)
	printf("%d\n",i);
//    printf("%d\n",i);  //ここを有効にするとエラーになるかどうかで分かりますよね。
    return 0;
}
C では、gcc Ver3.4.2 で、
foo.c:5: error: 'for' loop initial declaration used outside C99 mode
となるので、ANSI C99 でもたぶんエラーだと思われます。

tk-xleader

Re:変数のスコープなんですけど

#3

投稿記事 by tk-xleader » 18年前

VC++2005ではエラーになりましたが。これは中ということになりそうです。

Justy

Re:変数のスコープなんですけど

#4

投稿記事 by Justy » 18年前

 ちなみに MSVCはコンパイラオプションで挙動を選べます。 (/Zc:forScope)
http://www.ailight.jp/blog/sha256/archi ... /6683.aspx

toyo

Re:変数のスコープなんですけど

#5

投稿記事 by toyo » 18年前

Cでは変数の宣言ができるのはブロックの先頭だけですよね

Justy

Re:変数のスコープなんですけど

#6

投稿記事 by Justy » 18年前

>ブロックの先頭だけ
 古いCなら。
 新しいCは C++と同じように宣言できます。

http://seclan.dll.jp/c99d/c99d07.htm#dt19990927

Hermit

Re:変数のスコープなんですけど

#7

投稿記事 by Hermit » 18年前

>新しいCは C++と同じように宣言できます。
for(int i = 0;;) の様な宣言は、
gcc Ver3.4.2 では出来ないんですけど、
前に書いたように、
error: 'for' loop initial declaration used outside C99 mode
となるのだけど・・・・
#include <stdio.h>
int main()
{
    int i;
    for (i = 0; i < 10; i++)
	printf("%d\n",i);
    int j;
    for (j = 0; j < 10; j++)
	printf("%d\n",j);
    return 0;
}
の様にならコンパイル出来たんですが。
MinGW の gcc のバグでしょうか?

tk-xleader

Re:変数のスコープなんですけど

#8

投稿記事 by tk-xleader » 18年前

ちなみに、VC++2005の既定の状態でやりました。C99ならば制御文のブロック化が導入されたので、そのブロック
の中扱いということで良いんじゃないでしょうか。

Justy

Re:変数のスコープなんですけど

#9

投稿記事 by Justy » 18年前

gcc Ver3.4.2 では出来ないんですけど
 -std=c99の指定は付けてますか?
 gccは記憶がたしかなら 3.3あたりから使えたような気がします

Hermit

Re:変数のスコープなんですけど

#10

投稿記事 by Hermit » 18年前

おお、そのオプションが必要だったのですね。
gcc は、Ver3 あたりからはデフォルトで ANSI C99 なのかと思っていた(^^;

tk-xleader

Re:変数のスコープなんですけど

#11

投稿記事 by tk-xleader » 18年前

たぶん…
C89→エラー
C99→中
従C++→たぶん外
現C++→たぶん中
ということになるんじゃないでしょうか?

たかぎ

Re:変数のスコープなんですけど

#12

投稿記事 by たかぎ » 18年前

> C89→エラー
> C99→中
> 従C++→たぶん外
> 現C++→たぶん中

これであっています。
C++では、ARMでは外でしたが、標準C++では中になっています。
古い仕様(ARMとそれ以前)に準拠した処理系(代表的なのはVC6)では外になっています。

まだまだ

お礼

#13

投稿記事 by まだまだ » 18年前

皆様
いい勉強になりました。

中か外か
これから変更されないように祈ります。

どうも有難うございました。

たかぎ

Re:お礼

#14

投稿記事 by たかぎ » 18年前

> 中か外か
> これから変更されないように祈ります。

処理系のバグや、古い仕様の復刻版のようなものでない限り、今後変更される可能性はまずありません。

ところで、「外」になる古い処理系では、
#define for if(0);else for
といったマクロを定義して、強制的に「中」にするのが定番の手法です。

まだまだ

追伸

#15

投稿記事 by まだまだ » 18年前

>#define for if(0);else for
>といったマクロを定義して、強制的に「中」にするのが定番の手法です

すごいテクニックですね。
いつも勉強させていただいています。

でも、コンパイラスイッチで変更できるような仕様も含めて、
個人的には好ましくないような感じ、、、

また宜しくお願いします。

GPGA

Re:追伸

#16

投稿記事 by GPGA » 18年前

>C++では、ARMでは外でしたが、標準C++では中になっています。
現在仕事でARMを使用しているのですが、armcpp.exeでコンパイルを行ったところ、中と判断されました。
armcpp.exeに -v オプションがないので、正確なバージョンがわからないのですが
armcpp.exeのみで起動すると
ARM C++ Compiler, ADS1.2 [Build 838]
 
と表示されるので、おそらくVer1.2かと。

たかぎ

Re:追伸

#17

投稿記事 by たかぎ » 18年前

> 現在仕事でARMを使用しているのですが、armcpp.exeでコンパイルを行ったところ、中と判断されました。

ARM違いです。
ここでいうARMは、The Annotated C++ Reference Manual(邦訳, 注解 C++リファレンスマニュアル)のことです。
http://www.research.att.com/~bs/arm.html

GPGA

Re:追伸

#18

投稿記事 by GPGA » 18年前

>ARM違いです。
ARM違いでしたか。

閉鎖

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