ページ 11

for について質問です

Posted: 2008年9月18日(木) 00:33
by ムンバ
こんばんは。
先日は、ご迷惑をお掛けしまして、大変申し訳御座いませんでした。
ご丁重なご解説、どうもありがとう御座いました。
今日も「ゲームプログラミングの館」で勉強させて頂いてます。お世話になります。(謝

疑問に感じたので再度、質問させて頂きます。
(管理人様のソースや、ご解説に疑問を感じた訳では無いです。本当に勉強になってます。)

例えば、こちらのページのゲームプログラミングの館の「8. 時間を取得する。」の
for内の a++; なのですが・・・

i++; に変更して実行しても同じ値が表示されます。
この行を削除して実行すると、for内でのtime変数に代入された秒数が表示されます。
forより上の行のtime変数より、for内でのtime変数に時間が経過した分
1/1000単位でプラスされた値が表示されるのだと思います。

int i,a=0,time,White;

i はforの条件式を満たすと、終了する変数だと思うのですが
もし、a が無かった時は a に i が代入されて実行されて、うまく表示されるのでしょうか?
うまく、お伝えできなければ申し訳御座いません。

i++; に変更して実行しても同じ値が表示されるのは、どうしてなのでしょうか?
悩んでしまったので、お時間ある方、ご解説の程よろしくお願い致します。

Re:for について質問です

Posted: 2008年9月18日(木) 04:32
by 管理人
まずコードを見ながら整理して回答してみます。

(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 について質問です

Posted: 2008年9月18日(木) 23:45
by ムンバ
こんばんは。お世話になります。

お忙しい所、早速の丁重なご解説頂きましてありがとう御座います。
何度も申し訳御座いません。
せっかく付けて頂いたので、番号使わせて頂きますね。ありがとう御座います。^^

・・・(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 について質問です

Posted: 2008年9月18日(木) 23:50
by ムンバ
訂正:99999→100000に、1行目は0行目に訂正させて頂きます。(謝

Re:for について質問です

Posted: 2008年9月18日(木) 23:51
by ムンバ
何度もすみません。1行目は1行目のままで・・・。
もう、ごちゃごちゃで・・・。
本当に、ごめんなさい。<(_ _)>

Re:for について質問です

Posted: 2008年9月19日(金) 01:47
by 管理人
つまり端的に言えば
「for文内のaの計算が何故あるのか?」
ってことでしょうか?
単に10万回何でもいいから処理をしたかっただけです。
aはどこにも使われていません。
別にaの計算じゃなくても何でもいいです。無くてもいいですし。

Re:for について質問です

Posted: 2008年9月19日(金) 10:27
by ムンバ
早速のご解説、どうもありがとう御座います。
長々と申し訳御座いませんでした。

つまり「for文内のaの計算が何故あるのか?」ですね。
何処に行ってしまったのかと思いまして・・・。
思ったまま、素直にお聞きすれば良かったんですね。^^;

納得できました。ありがとう御座います。
本当に何度も、すみませんでした。(謝
引き続き、ゲームプログラミングの館で勉強させて頂きます。
できるだけご迷惑をお掛けしない様に気を付けますので
また何かあれば宜しくお願い致します。
(私、日本語の勉強もしないとですね。^^;)
ありがとう御座いました!