変数のスコープなんですけど
変数のスコープなんですけど
早速ですが
例えば、
for(int j; j<N; j++){
.....;
}
のような文で、loop変数jの定義はいったいforの中にあるとみなすべきか
for文の外にあるとみなすべきでしょうか。
あるいはどっかの設定(コンパイラ環境)に決めるもんでしょうか。
時々変わるような感じで、どういうわけでしょうか。
CとC++とは違う?
C++であっても、バージョーンにもよる?
頭混乱してます。
ご教授お願い致します
例えば、
for(int j; j<N; j++){
.....;
}
のような文で、loop変数jの定義はいったいforの中にあるとみなすべきか
for文の外にあるとみなすべきでしょうか。
あるいはどっかの設定(コンパイラ環境)に決めるもんでしょうか。
時々変わるような感じで、どういうわけでしょうか。
CとC++とは違う?
C++であっても、バージョーンにもよる?
頭混乱してます。
ご教授お願い致します
Re:変数のスコープなんですけど
C++ では、昔は for の外でしたが、
現在は、for の中の様です。
確か、ANSI だったかの変更があってから変わったはずです。
どの時点だったかは忘れましたが、BC++ Ver5.5.1 でも中だけなので、だいぶ昔の事の様です。
foo.c:5: error: 'for' loop initial declaration used outside C99 mode
となるので、ANSI C99 でもたぶんエラーだと思われます。
現在は、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 でもたぶんエラーだと思われます。
Re:変数のスコープなんですけど
ちなみに MSVCはコンパイラオプションで挙動を選べます。 (/Zc:forScope)
http://www.ailight.jp/blog/sha256/archi ... /6683.aspx
http://www.ailight.jp/blog/sha256/archi ... /6683.aspx
Re:変数のスコープなんですけど
>新しいCは C++と同じように宣言できます。
for(int i = 0;;) の様な宣言は、
gcc Ver3.4.2 では出来ないんですけど、
前に書いたように、
error: 'for' loop initial declaration used outside C99 mode
となるのだけど・・・・
MinGW の gcc のバグでしょうか?
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 のバグでしょうか?
Re:変数のスコープなんですけど
ちなみに、VC++2005の既定の状態でやりました。C99ならば制御文のブロック化が導入されたので、そのブロック
の中扱いということで良いんじゃないでしょうか。
の中扱いということで良いんじゃないでしょうか。
Re:変数のスコープなんですけど
>gcc Ver3.4.2 では出来ないんですけど
-std=c99の指定は付けてますか?
gccは記憶がたしかなら 3.3あたりから使えたような気がします
-std=c99の指定は付けてますか?
gccは記憶がたしかなら 3.3あたりから使えたような気がします
Re:変数のスコープなんですけど
> C89→エラー
> C99→中
> 従C++→たぶん外
> 現C++→たぶん中
これであっています。
C++では、ARMでは外でしたが、標準C++では中になっています。
古い仕様(ARMとそれ以前)に準拠した処理系(代表的なのはVC6)では外になっています。
> C99→中
> 従C++→たぶん外
> 現C++→たぶん中
これであっています。
C++では、ARMでは外でしたが、標準C++では中になっています。
古い仕様(ARMとそれ以前)に準拠した処理系(代表的なのはVC6)では外になっています。
Re:追伸
> 現在仕事でARMを使用しているのですが、armcpp.exeでコンパイルを行ったところ、中と判断されました。
ARM違いです。
ここでいうARMは、The Annotated C++ Reference Manual(邦訳, 注解 C++リファレンスマニュアル)のことです。
http://www.research.att.com/~bs/arm.html
ARM違いです。
ここでいうARMは、The Annotated C++ Reference Manual(邦訳, 注解 C++リファレンスマニュアル)のことです。
http://www.research.att.com/~bs/arm.html