こんばんは。
先日は、ご迷惑をお掛けしまして、大変申し訳御座いませんでした。
ご丁重なご解説、どうもありがとう御座いました。
今日も「ゲームプログラミングの館」で勉強させて頂いてます。お世話になります。(謝
疑問に感じたので再度、質問させて頂きます。
(管理人様のソースや、ご解説に疑問を感じた訳では無いです。本当に勉強になってます。)
例えば、こちらのページのゲームプログラミングの館の「8. 時間を取得する。」の
for内の a++; なのですが・・・
i++; に変更して実行しても同じ値が表示されます。
この行を削除して実行すると、for内でのtime変数に代入された秒数が表示されます。
forより上の行のtime変数より、for内でのtime変数に時間が経過した分
1/1000単位でプラスされた値が表示されるのだと思います。
int i,a=0,time,White;
i はforの条件式を満たすと、終了する変数だと思うのですが
もし、a が無かった時は a に i が代入されて実行されて、うまく表示されるのでしょうか?
うまく、お伝えできなければ申し訳御座いません。
i++; に変更して実行しても同じ値が表示されるのは、どうしてなのでしょうか?
悩んでしまったので、お時間ある方、ご解説の程よろしくお願い致します。
for について質問です
Re:for について質問です
まずコードを見ながら整理して回答してみます。
(1) for内の a++; なのですが・・i++; に変更して実行しても同じ値が表示されます。
(2) この行を削除して実行すると、for内でのtime変数に代入された秒数が表示されます。
(3) forより上の行のtime変数より、for内でのtime変数に時間が経過した分1/1000単位でプラスされた値が表示されるのだと思います。
(4) int i,a=0,time,White;
i はforの条件式を満たすと、終了する変数だと思うのですが もし、a が無かった時は a に i が代入されて実行されて、うまく表示されるのでしょうか?
(5) i++; に変更して実行しても同じ値が表示されるのは、どうしてなのでしょうか?
ということで一つずつ見て行きましょう。
結論からいうと、この計算は省略されているせいでしょう。
実際計算されていないと思います。
何故かと言うと、10万回足し算しようが、100万回足し算しようが、
のちにaという値はどこにも使用されてないですよね?
計算結果使わないのに計算してもしょうがないじゃないか
ってことでコンパイラが「必要ない」と解釈して
この計算を行わなかったためと思います。
ですから、このaの値を表示するなどしてあとで使ってやれば計算されるはずです。
もし、a++をi++にすると、1回のループでi++が2回行われるわけですよね。
つまり10万回ループするはずが、5万回になるので、
単純に計算時間は半分になると思われます。
よって(2)(3)(5)はそれで解決しますね。
(4)
>もし、a が無かった時は a に i が代入されて実行されて、うまく表示されるのでしょうか?
と言う部分がよくわかりません。
aが無かった場合ならaには何も代入されないですよね?
あまり番号付けた意味なかったですね^^;
(1) for内の a++; なのですが・・i++; に変更して実行しても同じ値が表示されます。
(2) この行を削除して実行すると、for内でのtime変数に代入された秒数が表示されます。
(3) forより上の行のtime変数より、for内でのtime変数に時間が経過した分1/1000単位でプラスされた値が表示されるのだと思います。
(4) int i,a=0,time,White;
i はforの条件式を満たすと、終了する変数だと思うのですが もし、a が無かった時は a に i が代入されて実行されて、うまく表示されるのでしょうか?
(5) i++; に変更して実行しても同じ値が表示されるのは、どうしてなのでしょうか?
ということで一つずつ見て行きましょう。
#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){ ChangeWindowMode( TRUE ) ; //ウィンドウモードにする。 if( DxLib_Init() == -1 ) return -1; // DXライブラリ初期化処理 エラーが起きたら終了 int i,a=0,time,White; White = GetColor( 255 , 255 , 255 ) ; // 白色の値を取得 time = GetNowCount() ; // 現在経過時間を得る DrawFormatString(0, 0, White , "立ち上がってから%dミリ秒", time);//文字列表示 for(i=0;i<100000;i++) //10万回a++;を実行 a++; time = GetNowCount() - time; //現在の経過時間から先ほどの経過時間を引く DrawFormatString(0,100, White , "計算時間%dミリ秒" , time);//文字列表示 WaitKey() ; // キーの入力待ち(『WaitKey』を使用) DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了 }(1)
結論からいうと、この計算は省略されているせいでしょう。
実際計算されていないと思います。
何故かと言うと、10万回足し算しようが、100万回足し算しようが、
のちにaという値はどこにも使用されてないですよね?
計算結果使わないのに計算してもしょうがないじゃないか
ってことでコンパイラが「必要ない」と解釈して
この計算を行わなかったためと思います。
ですから、このaの値を表示するなどしてあとで使ってやれば計算されるはずです。
もし、a++をi++にすると、1回のループでi++が2回行われるわけですよね。
つまり10万回ループするはずが、5万回になるので、
単純に計算時間は半分になると思われます。
よって(2)(3)(5)はそれで解決しますね。
(4)
>もし、a が無かった時は a に i が代入されて実行されて、うまく表示されるのでしょうか?
と言う部分がよくわかりません。
aが無かった場合ならaには何も代入されないですよね?
あまり番号付けた意味なかったですね^^;
Re:for について質問です
こんばんは。お世話になります。
お忙しい所、早速の丁重なご解説頂きましてありがとう御座います。
何度も申し訳御座いません。
せっかく付けて頂いたので、番号使わせて頂きますね。ありがとう御座います。^^
・・・(5)は自分の馬鹿さに、気付きましたので忘れて下さい。
って言いますか、(1)~(4)も、って事に成りかねないので(自爆
これも、うまくお伝えできなければ申し訳ないです。
本当に食い付こうとか、そういう趣旨は有りませんので(もう2度と言いません。^^)
もう少しだけ、お時間御座いましたら、ご指導の程よろしくお願い致します。
このa++;が無いと(2)(1・3・5は無視して頂いて^^;)に なるのですが
実は、かじった程度ですが、Perl(CGI)の勉強もしてまして、CGIのforで例えますと。
(# はコメントで、C言語の // に相当します。$aは、aと言う名前の自由な変数です。for{}内が実行文です。)
Perlの呼び出しや終了などは、省略させて頂きます。
-----------------------------------------------------------------------------------------------
(前略)
$a=0; # $aを0に初期化(代入)
for($i=0;$i<100000;$i++) { #()内はforの条件式
# 条件式→iを0に初期化して、変数iが(インクリメントで)100000未満になるまで繰り返し処理をする
$a++;
print"$a行目です。<BR>"; # print は、ブラウザに表示する。と言う意味です。<BR>はHTMLタグです。
}
(後略)
-----------------------------------------------------------------------------------------------
これをPerlのサーバー上で(ブラウザが要求して)実行されますと、1行目から99999行目まで、つまり
1行目です。
2行目です。
3行目です。
・
・
・
99998行目です。
99999行目です。
と、ブラウザに表示されます。鯖に負担が掛かりそうなので、実際には試してません。
(ああっ!?自分の知識を公表しようとかC言語と比較しようとかの趣旨もありませんです。)
Perlでは上述のスクリプトですと
$a=0; の行を省略しても、それ以前に$a(変数)に値が代入されて無ければ$aには0が入りますので
「1行目です。」~「99999行目です。」と同じ様に表示されます。
(↑これが、たぶん(3)に相当すると思います。)
$a++; の行を省略すると、(←これが(2)です。)
「0行目です。」~「0行目です。」と99999行、表示されます。
$a++; の行を $i++; に変更すると。(←これが(1)ですね。^^;)
「0行目です。」~「0行目です。」と、約(99999/2)行、表示されます。
そこで、(5)は無視して頂くとして <すみません。かなり赤面状態です。<自爆
(4)なのですが、このスクリプトで言う$a(変数)が
C言語で言う a に相当すると思ったんです。
この場合のa++;の a は、C言語では変数になるのですよね?
Perlでは $aと$i が、ここでの変数になります。
Perlでは、for文(繰り返し文)を使って、インクリメントされた$aを使い、この様に表示するのですが
Cでは、この a++;の a が何に使われている変数(インクリメントされていく値)なのか・・・
つまり、この a が、何処で使用されてるのか?
と、いう事をお聞きしたしたいのです。だと、思います。(自滅
すみません。本当にすみません。
自分では聞きたい事は解るのですが、うまく伝える事ができて無いんだと思います。
この a が、何を意味するのか(存在?)が、解らないのです。
aと、aをインクリメントされた値が、何処に使われるのでしょうか?
って事なんだと思います。(激涙
考えすぎなのでしょうか・・・?^^;
再度、宜しければ宜しくお願い致します。
お忙しい所、早速の丁重なご解説頂きましてありがとう御座います。
何度も申し訳御座いません。
せっかく付けて頂いたので、番号使わせて頂きますね。ありがとう御座います。^^
・・・(5)は自分の馬鹿さに、気付きましたので忘れて下さい。
って言いますか、(1)~(4)も、って事に成りかねないので(自爆
これも、うまくお伝えできなければ申し訳ないです。
本当に食い付こうとか、そういう趣旨は有りませんので(もう2度と言いません。^^)
もう少しだけ、お時間御座いましたら、ご指導の程よろしくお願い致します。
このa++;が無いと(2)(1・3・5は無視して頂いて^^;)に なるのですが
実は、かじった程度ですが、Perl(CGI)の勉強もしてまして、CGIのforで例えますと。
(# はコメントで、C言語の // に相当します。$aは、aと言う名前の自由な変数です。for{}内が実行文です。)
Perlの呼び出しや終了などは、省略させて頂きます。
-----------------------------------------------------------------------------------------------
(前略)
$a=0; # $aを0に初期化(代入)
for($i=0;$i<100000;$i++) { #()内はforの条件式
# 条件式→iを0に初期化して、変数iが(インクリメントで)100000未満になるまで繰り返し処理をする
$a++;
print"$a行目です。<BR>"; # print は、ブラウザに表示する。と言う意味です。<BR>はHTMLタグです。
}
(後略)
-----------------------------------------------------------------------------------------------
これをPerlのサーバー上で(ブラウザが要求して)実行されますと、1行目から99999行目まで、つまり
1行目です。
2行目です。
3行目です。
・
・
・
99998行目です。
99999行目です。
と、ブラウザに表示されます。鯖に負担が掛かりそうなので、実際には試してません。
(ああっ!?自分の知識を公表しようとかC言語と比較しようとかの趣旨もありませんです。)
Perlでは上述のスクリプトですと
$a=0; の行を省略しても、それ以前に$a(変数)に値が代入されて無ければ$aには0が入りますので
「1行目です。」~「99999行目です。」と同じ様に表示されます。
(↑これが、たぶん(3)に相当すると思います。)
$a++; の行を省略すると、(←これが(2)です。)
「0行目です。」~「0行目です。」と99999行、表示されます。
$a++; の行を $i++; に変更すると。(←これが(1)ですね。^^;)
「0行目です。」~「0行目です。」と、約(99999/2)行、表示されます。
そこで、(5)は無視して頂くとして <すみません。かなり赤面状態です。<自爆
(4)なのですが、このスクリプトで言う$a(変数)が
C言語で言う a に相当すると思ったんです。
この場合のa++;の a は、C言語では変数になるのですよね?
Perlでは $aと$i が、ここでの変数になります。
Perlでは、for文(繰り返し文)を使って、インクリメントされた$aを使い、この様に表示するのですが
Cでは、この a++;の a が何に使われている変数(インクリメントされていく値)なのか・・・
つまり、この a が、何処で使用されてるのか?
と、いう事をお聞きしたしたいのです。だと、思います。(自滅
すみません。本当にすみません。
自分では聞きたい事は解るのですが、うまく伝える事ができて無いんだと思います。
この a が、何を意味するのか(存在?)が、解らないのです。
aと、aをインクリメントされた値が、何処に使われるのでしょうか?
って事なんだと思います。(激涙
考えすぎなのでしょうか・・・?^^;
再度、宜しければ宜しくお願い致します。
Re:for について質問です
つまり端的に言えば
「for文内のaの計算が何故あるのか?」
ってことでしょうか?
単に10万回何でもいいから処理をしたかっただけです。
aはどこにも使われていません。
別にaの計算じゃなくても何でもいいです。無くてもいいですし。
「for文内のaの計算が何故あるのか?」
ってことでしょうか?
単に10万回何でもいいから処理をしたかっただけです。
aはどこにも使われていません。
別にaの計算じゃなくても何でもいいです。無くてもいいですし。
Re:for について質問です
早速のご解説、どうもありがとう御座います。
長々と申し訳御座いませんでした。
つまり「for文内のaの計算が何故あるのか?」ですね。
何処に行ってしまったのかと思いまして・・・。
思ったまま、素直にお聞きすれば良かったんですね。^^;
納得できました。ありがとう御座います。
本当に何度も、すみませんでした。(謝
引き続き、ゲームプログラミングの館で勉強させて頂きます。
できるだけご迷惑をお掛けしない様に気を付けますので
また何かあれば宜しくお願い致します。
(私、日本語の勉強もしないとですね。^^;)
ありがとう御座いました!
長々と申し訳御座いませんでした。
つまり「for文内のaの計算が何故あるのか?」ですね。
何処に行ってしまったのかと思いまして・・・。
思ったまま、素直にお聞きすれば良かったんですね。^^;
納得できました。ありがとう御座います。
本当に何度も、すみませんでした。(謝
引き続き、ゲームプログラミングの館で勉強させて頂きます。
できるだけご迷惑をお掛けしない様に気を付けますので
また何かあれば宜しくお願い致します。
(私、日本語の勉強もしないとですね。^^;)
ありがとう御座いました!