ループについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ループ

ループについて

#1

投稿記事 by ループ » 18年前

#include <stdio.h>

int powint(int , int);

int main(){
	int i;

	for(i = 0; i <= 10 ; i++){
		printf("%2d\t%d\n", i , powint(2,i));
	}

	return 0;
}
int powint(int x,int p) {
	int y = 1;
	while(p-- > 0) {
		y *= x;
	}
	return y;
}
powint()内のループが良く分かりません。
まず、xには2,pにはiがきますよね。すると、while(p-- > 0)ってのは最初0 > 0となってp--
ってできないのではないのですか?よくこの中のループ理解できないです。

あと、y *= xも微妙です。y = y * xのこと?

box

Re:ループについて

#2

投稿記事 by box » 18年前

> まず、xには2,pにはiがきますよね。すると、while(p-- > 0)ってのは最初0 > 0となってp--
> ってできないのではないのですか?よくこの中のループ理解できないです。

呼び出し元の i がゼロのとき、powint関数の引数 p は同じくゼロです。
すると、while文の条件判定で偽になります。
その場合、while文の中(y *= x;)を全く実行せずに、return y; します。
つまり、2のゼロ乗である、1を呼び出し元に返しているのです。

> あと、y *= xも微妙です。y = y * xのこと?

そうです。
+=, -=, /=, %= などの演算子と同種です。

ループ

Re:ループについて

#3

投稿記事 by ループ » 18年前

for()でfor(;;)ていう中になにもないやつってどういうこと?無限ループってことですか?

管理人

Re:ループについて

#4

投稿記事 by 管理人 » 18年前

そうです、
while(1)
のように無限ループになります。

ループ

Re:ループについて

#5

投稿記事 by ループ » 18年前

int main(void) {
	int num,count,rigth,ans;
	
	for(num = 1; num < 5; num++) {
		printf("%d + %d =",num,num);
		scanf("%d",&ans);
		if(ans == num + num){
			printf("%dは正解です\n",ans);
		}else{
			printf("NG\n");
			printf("もう一度回答してください\n");
			rigth =0;

			for(count = 0; count < 3 && !rigth; count++){
				printf("%d + %d =",num ,num);
				scanf("%d",&ans);
				if(ans == num + num) {
					printf("正解\n");
					rigth = 1;
				}
			}

			if(!rigth) {
				printf("%dが正解です",num + num);
			}
		}
		return 0;
	}
}
rigth =1,rigth =0とは一体なんでしょうか?どのような動きをするのでしょうか?

Yuki

Re:ループについて

#6

投稿記事 by Yuki » 18年前

正解判定フラグとでもいいますか。


if(ans == num + num) {
printf("正解\n");
rigth = 1;
}


入力された回答が正解だったら1、間違っていたら0としているようです。


for(count = 0; count < 3 && !rigth; count++){


の部分で、正解するか、3回間違えるまでループしています、

バグ

Re:ループについて

#7

投稿記事 by バグ » 18年前

変数rigthはフラグとして使われているようですね。
入力された答えがNGの場合には0が、正解だった場合には1がそれぞれ代入されています。

rigthが判定に使われているのは2ヶ所ありますね。1ヶ所はforループの中、もう1ヶ所はif文です。

まずは前者のforループですが、rigthの前に!演算子がありますね。これは真・偽を逆転させる演算子です。C言語では0を偽とし、それ以外( 大抵の場合は1 )を真と判定します。

つまり、countが3以下でなおかつrigthが0の場合にループを繰り返しなさいという意味になります。ですから、今回のforループは最初の入力でNGだった場合に、更に3回のリトライを行っている事になります。

そして後者のif文ですが、先ほどのforループ内で、3回のリトライ全てに不正解だった場合には、当然rigthは0のままな訳ですから、正解を表示している訳です。これは正解が入力された場合にはrigthが1になるので、表示されません。

Re:ループについて

#8

投稿記事 by » 18年前

return 0;
の位置がおかいような。
最初のfor文が機能していません。

ループ

Re:ループについて

#9

投稿記事 by ループ » 18年前

Yukiさん、バグさん解説ありがとうございます!

閉鎖

“C言語何でも質問掲示板” へ戻る