- PR -

変数の範囲

投稿者投稿内容
ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2006-10-04 10:08
引用:

だーやんさんの書き込み (2006-10-04 09:51) より:
上記コードだと、そのとおりだと思います。
今回の場合はi1がForブロックの後に宣言されているので、
i1はFor内で参照できません(よね?)ので同じ変数名でも曖昧さの解決が出来るはずではないでしょうか?


これも追加しとくか。
・i1はHogeプロシージャ全体で参照できるだろ?
これで納得できん?

で。参照できる範囲については最初にまどか氏から答えが出てるよ。
全員の意見を合わせて理解してくれるのとばかり思っていた。端折って悪かった。
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2006-10-04 10:13
引用:

だーやんさんの書き込み (2006-10-04 09:51) より:

上記コードだと、そのとおりだと思います。
今回の場合はi1がForブロックの後に宣言されているので、
i1はFor内で参照できません(よね?)ので同じ変数名でも曖昧さの解決が出来るはずではないでしょうか?


後とか前とかは関係ないですよ。
同じスコープにいるのが問題なわけで。

もし出来たとしても、そんなわかりにくいソースは見たくないですけどね。
minminnana
大ベテラン
会議室デビュー日: 2004/02/05
投稿数: 246
お住まい・勤務地: 盛岡
投稿日時: 2006-10-04 10:15
VBだとメッセージが判り辛いのですが、C#だとこんなメッセージが表示されます。
--
ローカルの変数 'index' をこのスコープで宣言することはできません。これは、'子' スコープで別の意味を持つ 'index' の意味が変更されるのを避けるためです。
--
と表示されます。
結局、紛らわしいので宣言位置に関わらず単純に同一スコープで同じ変数名の使用を許さないと「決めた」ということではないでしょうか?
るぱん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 1370
投稿日時: 2006-10-04 10:24
スコープが何かと言うところでつまずいているように思います。

コード:
Sub A()
Dim i As Integer
    i = 0
    i = B(i)
    MsgBox i
End Sub
Function B(ByVal i As Integer)As Integer
    MsgBox i
    For j = 1 to 100
        MsgBox i
        MsgBox j
        i = i + j
    Next j
    MsgBox i
    MsgBox j
    B = i
End Function


VB6のコードです。
上位バージョンで動かなかったらごめんよ。
多分動くはず。

紛らわしいiの意味も考えてみてくださいね
まどか
ぬし
会議室デビュー日: 2005/09/06
投稿数: 372
お住まい・勤務地: ますのすし管区
投稿日時: 2006-10-04 10:30
Dimはそのプロシージャ全体で見えます。
For文はプロシージャに書かれていますのでその中でDimのiを見れるわけです。
で、Forにiを宣言することによりDimのiより内側に同じ名前が登場したため
Forの内側ではForで宣言したiしか見れなくなるよというのがメッセージの「非表示」の意味です。
だーやん
会議室デビュー日: 2004/03/07
投稿数: 16
投稿日時: 2006-10-04 10:48
引用:

まどかさんの書き込み (2006-10-04 10:30) より:
Dimはそのプロシージャ全体で見えます。
For文はプロシージャに書かれていますのでその中でDimのiを見れるわけです。
で、Forにiを宣言することによりDimのiより内側に同じ名前が登場したため
Forの内側ではForで宣言したiしか見れなくなるよというのがメッセージの「非表示」の意味です。



まどかさんの言う「見える」や「参照できる」とは、その変数に対して値の参照や代入が出来るというのと違う意味ですか?
Dim宣言の前にその変数に対し値を設定しようとすると、同じプロシージャ内でも
ローカル変数'hoge'は宣言されているため、参照できません。
というコンパイルエラーが出ます。そのため、参照できる範囲というのを宣言されてからプロシージャが終わるまでと解釈していたのですが、そこがそもそも間違っています?
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2006-10-04 10:54
いやそもそもこれをエラーにするようになった理由は、
コンパイラにはあいまいでなくても、人間に分かりにくいものは
エラーにするという方針によるものでしょう。
C#とかはそういう方向に行ってますよね?

C++とかは、ローカル変数でも内部が優先というルールですから、
同じルールで行けばコンパイラは別に困りませんが、
人間にとっては勘違い、読み違い、バグの元になりやすい。
なのであえてエラーになるようにしている。

したがって、宣言位置より上だからあいまいではないとか、
そもそもそういう問題ではないわけです。
未記入
常連さん
会議室デビュー日: 2005/05/07
投稿数: 32
投稿日時: 2006-10-04 11:06
だーやんさんはJavaとかほかの言語に慣れている人なのではありませんか ?
Javaではふつーにこういうコード書きますよね。

コード:
void hoge(){
  for(int i=0; i<10; i++){
  }

  for(int i=10; i<20; i++){
  }

  int i;
  // ...
}

スキルアップ/キャリアアップ(JOB@IT)