おはようございます! これは、見通しの中でそれらの驚くほど簡単な質問の1つになってしまうだろうが、私の人生にとって私は困惑している。私はThe C Programming Languageの演習のいくつかを行っています。ループを初期化するコードを書くことができました。いくつかのグーグルの後、私は0にループを初期化するより良い方法を見つけましたが、私はそれを行うために書いたループが終了しない理由を理解していません。私はデバッガを使って、 'c'変数が決して50に達していないこと、49に達してから0にロールオーバーすることを知っていますが、なぜそれが転がっているのか分かりません。コードは下に添付されています、誰でもここで何が起こっているのか分かりますか?Cループは終了しません
#include <stdio.h>
#define IN 1
#define OUT 0
/* Write a program to print a histogram of the lengths of words in
itsinput. */
main()
{
int c=0;
int histogram[50]={0}
int current_length=0;
int state=OUT;
//Here we borrow C so we don't have to use i
printf("Initializing...\n");
while(c<51){
histogram[c] =0;
c=c+1;
}
c=0;
printf("Done\n");
while((c=getchar()) != EOF){
if((c==32 || c==10) && state==IN){
//End of word
state=OUT;
histogram[current_length++];
}else if((c>=33 && c<=126) && state==OUT){
//Start of word
state=IN;
current_length=0;
}else if((c>=33 && c<=126) && state==IN){
//In a word
current_length++;
} else {
//Not in a word
//Example, " " or " \n "
;
}
}
//Print the histogram
//Recycle current_length to hold the length of the longest word
//Find longest word
for(c=0; c<50; c++){
if(c>histogram[c])
current_length=histogram[c];
}
for(c=current_length; c>=0; c--){
for(state=0; state<=50; state++){
if(histogram[c]>=current_length)
printf("_");
else
printf(" ");
}
}
}
この行に注意してください: 'while(c <51)'! – Till
int histogram [50] = {0} '宣言の後にセミコロンがありません。宣言でヒストグラムを初期化したので、ループ内で再度実行する必要はありません。ループでは、 'c <51'ではなく' c <50'をチェックする必要があります。 –
変数をリサイクルしないでください。できる限りローカル(小)としてスコープを作成し、必要に応じて新しいスコープを宣言します。コンパイラはこれをとにかく最適化します。 – bitmask