演算子?実行結果がエンドレスになる

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

演算子?実行結果がエンドレスになる

#1

投稿記事 by まりも » 16年前

C言語歴(と言っていいのかな?)1週間です。
for文をやってます。
四則演算は学生時代に習った算数と同じだと理解しています。
サンプルソースを実行後、数字の部分を色々変化させて、どういう実行結果になるのか
試していたのですが、途中でエンドレスの実行結果が出てしまい、なぜそうなってしまうのか
わからなくて困ってます。(参考書に見当たりませんでした;;)
きっと初歩的な事だと思うんですが、誰か教えて頂けないでしょうか?(泣)

下記がそのソースコードです。

#include <stdio.h>
main() {

int num ;
for ( num = 2 ; num >= 10 ; num*2)
{
printf("%d\n",num);
}
}
  ◆実行結果◆
 2
 2
 2
 2
 ・・・・・とエンドレスで2が出てきます。

Ma

Re:演算子?実行結果がエンドレスになる

#2

投稿記事 by Ma » 16年前

#include <stdio.h> 
main() { 
		for (int num = 2 ; num <= 10 ; num *= 2){ 
			printf("%d\n",num); 
		} 
}
こういうことがやりたいのかな。

チルチル

Re:演算子?実行結果がエンドレスになる

#3

投稿記事 by チルチル » 16年前

見た感じfor文は1回も実行されないように見えるんですけどね・・
エンドレスになるのはmain関数に問題があるのかもしれません
おそらく10以下の時にループしたいんだと思いますが
私もコードを書くとこんな感じでしょうかね・・
#include <stdio.h>
int main(void){
	int num;
	for ( num=2;num<=10;num*2 ){
		printf("%d\n",num);
	}
	return 0;
}

まりも

Re:演算子?実行結果がエンドレスになる

#4

投稿記事 by まりも » 16年前

Maさん、真夜中に返答ありがとうございます。^^

num*2  で 表示すると 実行結果がエンドレスになってしまうのに
 num *= 2 だと      実行結果が 2・4・8 でちゃんと終了しました。

   ・・・・・なんででしょう??

  今はこういう実行結果を出したい!という視点ではなく(レベルでも無く・・・;;)
  どんなきまりで計算(実行?)するんだろう?
  って実行結果を見て確認しながら、理解を深めていっている段階です。 

  num*2 と num *= 2 はどう意味が違うんでしょう????
  (違うんだなって事だけわかりました。^^)

  
   

sizuma

Re:演算子?実行結果がエンドレスになる

#5

投稿記事 by sizuma » 16年前

num *= 2
これは
num = num * 2
ですよ。

DVDM

Re:演算子?実行結果がエンドレスになる

#6

投稿記事 by DVDM » 16年前

>>まりもさん
num*2 は単に値を二倍しているだけです。
numを2、4、8・・・としたいのであれば
この二倍したnumをnumに格納する必要があります。
(num*=2 は num=num*2 と同じ意味です)

つまり、for文でnumを倍にするという流れはこうなります。

■num*=2 または、num=num*2の場合
numの初期値が2ですので、
num *= 2 → num = num(2) * 2; ここでnumが4になります。
次のループで
num *= 2 → num = num(4) * 2; ここでnumが8になります。
次のループで
num *= 2 → num = num(8) * 2; ここでnumが16になり、num<=10の条件から外れますので
printfは呼ばれずに終了です。


■num*2の場合
numの初期値が2ですので、
num * 2 → num(2) * 2; numを二倍します。
次のループで
num * 2 → num(2) * 2; numを二倍します。
次のループで
num * 2 → num(2) * 2; numを二倍します。
これがずっと続くため、「num<=10」の条件を満たし続けているため無限ループになります。

base

Re:演算子?実行結果がエンドレスになる

#7

投稿記事 by base » 16年前

それはforの増分のところがnum*2になっているとnum*2はただ計算されて=ではないのでnumに代入されないためだと思います。

まりも

Re:演算子?実行結果がエンドレスになる

#8

投稿記事 by まりも » 16年前

チルチルさん回答ありがとうございます。
回答頂けて、とってもうれしいです。

さっそく書いてもらったコードの通りに打ちなおしてみました。

でも結果が・・・・エンドレスに!!;;(なんで?どうしてなんだろう???)

main関数はまだ全然勉強してないので、
(今使用の参考書には ”とりあえずおまじないと覚えててください”と説明)
おいおい調べていきたいと思います。

ちなみにコンパイラは gcc というものを使用しています。

私の四則演算の理解がまだまだ足りないなのかなぁ・・・。
でも・・こうやって、答えてくれる人がいるだけで、頑張るエネルギーがもらえます。
ありがとうです。

まりも

Re:演算子?実行結果がエンドレスになる

#9

投稿記事 by まりも » 16年前

DVDMさんへ
「きゃあああ~」って思わず叫びたくなる位、わかりやすい回答でした。
 「なんでエンドレスになっちゃうの????」にしっかり答えてくれて感激です。
baseさんが答えてくれた中の言葉「代入」と
DVDMさんの「格納」はたぶん同じ意味だと思うのですが、
今回のエンドレス解決のキーワードは
まさしくこの「格納」「代入」の概念でした。!!

 = ・・・⇒ってすごい大事なキーワードだったんですねー!(しみじみ・・)
 まだ始めたばっかりですが、進んだり、戻ったりしつつ 理解していきますね♪

  問題がすっきり解決しました。
  超初歩的な質問に答えて頂いてありがとうございました。
  

まりも

Re:演算子?実行結果がエンドレスになる

#10

投稿記事 by まりも » 16年前

・・・・またまた超初心者の質問でごめんなさい><

問題解決したので終了(解決マークを出)したいのですが、
ど・・どーしたらいいんでしょう??

初めて投稿したのでやり方がわかりません。・・・orz

ごめんなさい・・・。

DVDM

Re:演算子?実行結果がエンドレスになる

#11

投稿記事 by DVDM » 16年前

>>まりもさん
コメントを掲示板に投稿する時に、下の方にあります
マーク □[color=red>解決![/color]
の所にチェックを入れたあと 「投稿」 ボタンを押すと解決マークが付きます。

[color=gray>
>baseさんが答えてくれた中の言葉「代入」と
>DVDMさんの「格納」はたぶん同じ意味だと思うのですが、 [/color]
私の中で変数は箱のイメージがあるため、
そこにモノ(値)を格納するという意味合いでこの言葉を使っています・・・
わかりにくい表現で申し訳ないです;
代入という意味で捉えて頂ければOKです。

conio

Re:演算子?実行結果がエンドレスになる

#12

投稿記事 by conio » 16年前

>>チルチルさん
>>見た感じfor文は1回も実行されないように見えるんですけどね・・ 
>>エンドレスになるのはmain関数に問題があるのかもしれません 

>>私もコードを書くとこんな感じでしょうかね・・ 

#include <stdio.h>
int main(void){
	int num;
	for ( num=2;num<=10;num*2 ){
		printf("%d\n",num);
	}
	return 0;
}

今回の場合はmain関数が問題ではないですし、for文も実行されています。
原因はnumの値が変化しないので無限ループになっていることです。

コードもこう修正するべきでしょう。
------------------------------------------------------------
for ( num=2;num<=10;num*2 ){
↓
for ( num=2;num<=10;num*=2 ){
------------------------------------------------------------

【追記】
まりもさんが一番初めに書かれたコードではnum >= 10となっていて、
for文の中身は実行されないようになっていました。
失礼しました。
ただ、「無限ループになっていた」との事なので、継続条件の所は記述ミスなのかな と思ったり。

まりも

Re:演算子?実行結果がエンドレスになる

#13

投稿記事 by まりも » 16年前

DVDMさん
またまた 終了の仕方を教えてくれて感謝です。アリ(´・ω・)(´_ _)ガト♪

conioさん

おっしゃる通り 継続条件の所 num >= 10 は記述ミスでした。
               num <= 10 が実際のコードです。

  果てしなく繰り返し計算されちゃうこの状態を「無限ループ」って言うんですねぇ・・。
  まだまだ知らない言葉がイッパイで「???」状態ですが、
  一個一個用語を覚えていくのも、今は新鮮で楽しいです。

  これからも頑張って楽しくC言語理解してこうと思います。

  回答をくださった皆様ありがとうございました。
  これにて〆ます。

閉鎖

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