2016-08-25 7 views
0

次のような理由で、他の大学生と議論があります。C:infinteループの正しい理由

#include <stdio.h> 
#include <stdlib.h> 

void print_sign2(void); 

int ctr; 
char sign1='x'; 
char sign2='='; 


int main() { 
    for (ctr=0; ctr<10; ctr++){ 
     printf("%c",sign1); 
     print_sign2(); 
    } 
    return 0; 
} 

void print_sign2(void) { 
    for (ctr=0; ctr<2; ctr++) 
     printf("%c",sign2); 
} 

私はctr整数はグローバルであり、また機能print_sign2で使用されているため、このループが発生していると思います。機能print_sign2ctrと呼ばれるたびに0に設定されることを意味します。

+1

あなたは 'printf("%d \ n "、ctr);を' print_sign2'の呼び出しの前後に置くことで、この質問に答えることができます。 (あなたはほぼ*右です) – zwol

+3

より正確には、 'print_sign2'は毎回' ctr'を '2'に設定します。理由を見ますか? –

+0

できるだけグローバルを使用しないようにする理由の教科書の例。 –

答えて

6

print_sign2が終了すると、ctr<2はfalseです。これが最初に偽になるのは、ctrが2であるためです。したがってmainのループは終了しません。ctrは決して3を超えないため、ctr<10は常にtrueです。

2

ctrmainで2以上になることはありません。そのため、無限ループです。

毎回print_sign2()となると、値はctr = 2に設定されます。

0

グローバル変数をループ制御変数として使用しないでください。それはちょうどプログラミングの貧弱な実践です。代わりにローカル変数を使用してください。

ループ制御にローカル変数を使用すると、問題が完全に回避されます。

#include <stdio.h> 
#include <stdlib.h> 

void print_sign2(void); 

char sign1='x'; 
char sign2='='; 


int main() { 
    int ctr; 
    for (ctr=0; ctr<10; ctr++){ 
     printf("%c",sign1); 
     print_sign2(); 
    } 
    return 0; 
} 

void print_sign2(void) { 
    int ctr; 
    for (ctr=0; ctr<2; ctr++) 
     printf("%c",sign2); 
} 
関連する問題