C言語関係掲示板

過去ログ

No.1013 while文の初期化の位置

[戻る] [ホームページ]
No.1235

while文の初期化について
投稿者---まながつお(2004/02/04 11:54:52)


こんにちは、今演習問題の6-3-1の問4で悩んだ者です。
while文を用いた場合、変数の初期化は
while条件の前に行わないと無限ループに
陥ってしまいます。
後で初期化してもi++やj++などの加算処理があれば
問題無いと思ったのですが、どうして真の状態が
続いてしまうのでしょうか?
どうかご回答をお願いします。

No.1237

Re:while文の初期化について
投稿者---ともじ(2004/02/04 12:12:08)


>while文を用いた場合、変数の初期化は
>while条件の前に行わないと無限ループに
>陥ってしまいます。
>後で初期化してもi++やj++などの加算処理があれば
>問題無いと思ったのですが、どうして真の状態が
>続いてしまうのでしょうか?

自動変数は、宣言しただけでは不定値が格納されています。
もし、その不定値が-2147483648だったらどうでしょう。
 while ( i < 10 )
では、2147483658回ループしてしまいますよね。

No.1238

Re:while文の初期化について
投稿者---ぴのきよ(2004/02/04 12:12:33)


>while文を用いた場合、変数の初期化は
>while条件の前に行わないと無限ループに
>陥ってしまいます。

無限ループしてしまうソース載せてみるといいかも。

No.1239

Re:while文の初期化について
投稿者---まながつお(2004/02/04 13:30:34)


早いご回答に感謝いたします。
躓いたのはtate=0;の位置のせいでした。

>無限ループしてしまうソース載せてみるといいかも。

これが無限版です。
#include <stdio.h>
int main(void)
{
    int tate,yoko;
        
    while(tate<10){
        tate=0;
        yoko=0;
        while(yoko<=tate){
            printf("%d",yoko);
            yoko++;
        }
        printf("\n");
        tate++;
    }


修正したのはこちらです。
#include <stdio.h>
int main(void)
{
    int tate,yoko;
        
    tate=0;
    while(tate<10){
        yoko=0;
        while(yoko<=tate){
            printf("%d",yoko);
            yoko++;
        }
        printf("\n");
        tate++;
    }


内と外とでは何が違うのでしょうか?

No.1240

Re:while文の初期化について
投稿者---通りすがり(2004/02/04 13:50:47)


無限ループ版

#include <stdio.h>
int main(int argc, char *argv[])
{
    int tate,yoko;
        
    while(tate<10){
        tate=0;
        yoko=0;
        /*
        while(yoko<=tate){
            printf("%d",yoko);
            yoko++;
        }
        */
        printf("%d\n", tate);
        tate++;
    }
    return 0;
}


修正版

#include <stdio.h>
int main(int argc, char *argv[])
{
    int tate,yoko;
        
    tate=0;
    while(tate<10){
        yoko=0;
        /*
        while(yoko<=tate){
            printf("%d",yoko);
            yoko++;
        }
        */
        printf("%d\n", tate);
        tate++;
    }
    
    return 0;
}

こうすれば分かりますか?

No.1241

Re:while文の初期化について
投稿者---ともじ(2004/02/04 13:57:40)


>内と外とでは何が違うのでしょうか?

以下のようになるので、無限ループになるのです。

#include <stdio.h>
int main(void)
{
    int tate,yoko;
        
    while(tate<10){  /* tateに最初に10以上の不定値が入っていると、一度もループしない場合もある */
        tate=0;   /* ※の箇所でインクリメントされても、すぐに 0 に戻り、無限ループへ */
        yoko=0;
        while(yoko<=tate){
            printf("%d",yoko);
            yoko++;
        }
        printf("\n");
        tate++;   /* ※ */
    }
}



No.1242

Re:while文の初期化について
投稿者---まながつお(2004/02/04 14:53:31)


重ね重ねのお早い回答、本当に恐れ入ります。
while文の中で条件に対応した変数の0設定を行うと
スタート地点からの逆戻り状態になってしまうのですね。
いろいろとありがとうございました。