アカウント名:
パスワード:
一度しか通らない道だから実行結果に問題はないんだけど、コードの途中に突然変数の宣言が現れてその変数を一時的に使ってたりとかなら・・・。あとプロシージャの中でGotoとGosubとか日常的に使いまくりだったりとか・・・。
でもちゃんと動くからいいじゃない。人に見せるわけでもないしいいよね。どうせ見るのは自分だし・・・。的な思いからそのままになってます。
コードの途中に突然変数の宣言が現れてその変数を一時的に使ってたりとかなら・・・。
え、これってダメなの?使う場所の近くで宣言する方がいいって思ってるんですが。
言語にもよるけど変数のスコープは小さければ小さいほどいい。javaで言えばfor(int i=1 ; i < MAX ; i++ ){ // ナニかの処理}みたいなのは推奨されてる。(この場合のループカウンタはfor文の中だけで有効)
ただ、たかだが50行~100行程度のメソッドで、スコープが得に小さくなるわけでもないのに宣言だけあちこちに乱立するくらいなら、メソッドの先頭にまとめちゃうのも一つの手だとは思う。
これが50~100行程度のメソッドで、他の変数が全部先頭にまとめられているのに、あとで書き足した初心者プログラマーが変数宣言を途中に追加したら、他の理由がない限り先頭に入れるように書き直せと指示すると思う。
> for(int i=1 ; i < MAX ; i++ ){これって
for(int i = 0; i < MAX; i++) {
か
for(int i = 1; i < MAX + 1; i++) {
ではないですか?
変数のスコープをなるべく小さくするのは、初期化忘れの防止が1つの動機ですが不適当な値での初期化に気づかせる効果もあります。
あと
for (int i = 0; i < LONG_MAX; i++) {
であったら、i は int ではなく long である必要があることに気づくので、変数の型が妥当かに気づく機会も与えています。
・・・オレは釣られたのか?
> for(int i = 0; i < MAX; i++) {> for(int i = 1; i < MAX + 1; i++) {>ではないですか?
for文的にはfor(int i = 10 ; i < MAX-2 ; i += 2 ) {とかもありですよ。あんまり使わないかもしれないけど。配列のアクセスなら 0~N-1 が圧倒的に多いだけ。
>変数のスコープをなるべく小さくするのは、初期化忘れの防止が1つの動機ですがそれだけでしたら、(この例においては) for文を使って左側で初期値を設定すれば十分です。そこで変数宣言する必要はありません。
一般的な32bit環境ではintとlongのサイズは共に32bitなのでintからlongに変える必要が生じたとしたら
・intが16bitの組み込みマイコンと格闘していた・longが64bitの64bitプロセッサと格闘していた・相当変態的なABIを採用する32bitマシンと格闘していた
のうちのどれかでしょう。2つ目は根本的に仕様を見直した方がよさそうですが、1つ目なら割とよくある話だと思います。
つられたというか、前提条件がないのでどうでも良い部分。普通なら OK とも NG とも言えない。
あとfor (int i = 0; i < LONG_MAX; i++) {であったら、i は int ではなく long である必要があることに気づくので、変数の型が妥当かに気づく機会も与えています。
今時のコンパイラならふつーに警告出るでしょ。
VBでもVB6以前とVB7以降(VB.NET)で違うと思う。
VB6以前だとブロック?の概念がないのでプロシージャの途中で宣言した変数のスコープはプロシージャ全体になるけどVB7以降だとそのブロック内に限定されるはず。
※変数はスコープをできる限り最小にしつつ宣言はそのスコープの先頭で行うのが原則だと思う。
VB使いのレベルのひどさが垣間見られるね。
ちょっと待て、COBOLerなんだが...
と言うのは置いといて、Cなどでは普通だと思うけどVBだと問題なのかな?
JavaScriptだと明らかに問題ですね。関数の途中とかブロックの中で「var i;」とか宣言しても、あたかもすべて関数の先頭で宣言したかのように振る舞うというすごい特徴を持っています。複数回宣言すると1つにまとめられます。これはECMA-262で厳密に定められた仕様なのですが、宣言はすべて関数の先頭で行わないと一見不可解な動作をすることになります。C90(not C++)のように言語仕様で強制されているよりもたちが悪いです。というわけで「言語による」ような気がします。
JavaScriptは、暗黙の参照渡しなど、Cに慣れた人には罠が多いですよね。
参照渡し(call by reference)というと、C++/PHPのreferenceや、VB(Script)のByRef、Perlのような、変数そのものへの参照を意味することが多いです。その意味で言うと、JavaScriptは参照渡しではありません。
void foo(int& a) { a += 1; } // call by reference int i = 1;foo(i);// i => 2
JavaScriptは全てがオブジェクトです(Javaと違って整数等もオブジェクト。)から、「オブジェクトへの参照」の、値渡し(call by value)です。
function foo(a) { a += 1; } // call by valuefunction bar(b) { b.push(1); } // call by value var i = 1, ary = [];foo(i);bar(ary);// i => 1, ary => [ 1 ]
ごめんね。>VB使いのレベルのひどさが垣間見られるね。これはあなたに対する同意のコメントでした。
自分のレベルの低さは認識してるんで否定しないよ。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
クラックを法規制強化で止められると思ってる奴は頭がおかしい -- あるアレゲ人
VBだけど (スコア:0)
一度しか通らない道だから実行結果に問題はないんだけど、
コードの途中に突然変数の宣言が現れてその変数を一時的に使ってたりとかなら・・・。
あとプロシージャの中でGotoとGosubとか日常的に使いまくりだったりとか・・・。
でもちゃんと動くからいいじゃない。
人に見せるわけでもないしいいよね。
どうせ見るのは自分だし・・・。
的な思いからそのままになってます。
Re:VBだけど (スコア:1)
コードの途中に突然変数の宣言が現れてその変数を一時的に使ってたりとかなら・・・。
え、これってダメなの?
使う場所の近くで宣言する方がいいって思ってるんですが。
Re:VBだけど (スコア:2, すばらしい洞察)
言語にもよるけど変数のスコープは小さければ小さいほどいい。javaで言えば
for(int i=1 ; i < MAX ; i++ ){
// ナニかの処理
}
みたいなのは推奨されてる。(この場合のループカウンタはfor文の中だけで有効)
ただ、たかだが50行~100行程度のメソッドで、スコープが得に小さくなるわけでも
ないのに宣言だけあちこちに乱立するくらいなら、メソッドの先頭にまとめちゃう
のも一つの手だとは思う。
これが50~100行程度のメソッドで、他の変数が全部先頭にまとめられているのに、
あとで書き足した初心者プログラマーが変数宣言を途中に追加したら、他の理由がない
限り先頭に入れるように書き直せと指示すると思う。
Re:VBだけど (スコア:2)
> for(int i=1 ; i < MAX ; i++ ){
これって
か
ではないですか?
変数のスコープをなるべく小さくするのは、初期化忘れの防止が1つの動機ですが
不適当な値での初期化に気づかせる効果もあります。
あと
であったら、i は int ではなく long である必要があることに気づくので、
変数の型が妥当かに気づく機会も与えています。
・・・オレは釣られたのか?
Re: (スコア:0)
> for(int i = 0; i < MAX; i++) {
> for(int i = 1; i < MAX + 1; i++) {
>ではないですか?
for文的には
for(int i = 10 ; i < MAX-2 ; i += 2 ) {
とかもありですよ。あんまり使わないかもしれないけど。
配列のアクセスなら 0~N-1 が圧倒的に多いだけ。
>変数のスコープをなるべく小さくするのは、初期化忘れの防止が1つの動機ですが
それだけでしたら、(この例においては) for文を使って左側で初期値を設定すれば十分です。
そこで変数宣言する必要はありません。
Re: (スコア:0)
>> 変数のスコープをなるべく小さくするのは、初期化忘れの防止が1つの動機ですが
> それだけでしたら、(この例においては) for文を使って左側で初期値を設定すれば十分です。
> そこで変数宣言する必要はありません。
おっしゃる通りなのですが、自分は、
・初期化が必要な変数は、極力宣言と同時に初期化する。
というのも初期化忘れ防止の一つとしています。
とすると、そこで変数宣言する必要がでてくるんではないかと思います。
如何でしょうか?
Re: (スコア:0)
>
> であったら、i は int ではなく long である必要があることに気づくので、
> 変数の型が妥当かに気づく機会も与えています。
その前に本当に LONG_MAX(約20億?)回の繰り返し処理が必要なのか問い詰めたい。
Re: (スコア:0)
一般的な32bit環境ではintとlongのサイズは共に32bitなので
intからlongに変える必要が生じたとしたら
・intが16bitの組み込みマイコンと格闘していた
・longが64bitの64bitプロセッサと格闘していた
・
相当変態的なABIを採用する32bitマシンと格闘していたのうちのどれかでしょう。
2つ目は根本的に仕様を見直した方がよさそうですが、
1つ目なら割とよくある話だと思います。
Re: (スコア:0)
つられたというか、前提条件がないのでどうでも良い部分。
普通なら OK とも NG とも言えない。
Re: (スコア:0)
今時のコンパイラならふつーに警告出るでしょ。
Re:VBだけど (スコア:1)
VBでもVB6以前とVB7以降(VB.NET)で違うと思う。
VB6以前だとブロック?の概念がないのでプロシージャの途中で宣言した変数のスコープはプロシージャ全体になるけど
VB7以降だとそのブロック内に限定されるはず。
※変数はスコープをできる限り最小にしつつ宣言はそのスコープの先頭で行うのが原則だと思う。
Re: (スコア:0)
VB使いのレベルのひどさが垣間見られるね。
Re:VBだけど (スコア:1)
VB使いのレベルのひどさが垣間見られるね。
ちょっと待て、COBOLerなんだが...
と言うのは置いといて、Cなどでは普通だと思うけどVBだと問題なのかな?
Re: (スコア:0)
JavaScriptだと明らかに問題ですね。関数の途中とかブロックの中で「var i;」とか宣言しても、あたかもすべて関数の先頭で宣言したかのように振る舞うというすごい特徴を持っています。複数回宣言すると1つにまとめられます。これはECMA-262で厳密に定められた仕様なのですが、宣言はすべて関数の先頭で行わないと一見不可解な動作をすることになります。C90(not C++)のように言語仕様で強制されているよりもたちが悪いです。
というわけで「言語による」ような気がします。
Re:VBだけど (スコア:1)
JavaScriptは、暗黙の参照渡しなど、Cに慣れた人には罠が多いですよね。
Re:VBだけど (スコア:1)
参照渡し(call by reference)というと、C++/PHPのreferenceや、VB(Script)のByRef、Perlのような、変数そのものへの参照を意味することが多いです。その意味で言うと、JavaScriptは参照渡しではありません。
JavaScriptは全てがオブジェクトです(Javaと違って整数等もオブジェクト。)から、「オブジェクトへの参照」の、値渡し(call by value)です。
Re: (スコア:0)
Re:VBだけど (スコア:1)
Re: (スコア:0)
ごめんね。
>VB使いのレベルのひどさが垣間見られるね。
これはあなたに対する同意のコメントでした。
Re:VBだけど (スコア:1)
自分のレベルの低さは認識してるんで否定しないよ。