ページ 1 / 1
演算子?実行結果がエンドレスになる
Posted: 2009年10月01日(木) 00:28
by まりも
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が出てきます。
Re:演算子?実行結果がエンドレスになる
Posted: 2009年10月01日(木) 00:34
by Ma
#include <stdio.h>
main() {
for (int num = 2 ; num <= 10 ; num *= 2){
printf("%d\n",num);
}
}
こういうことがやりたいのかな。
Re:演算子?実行結果がエンドレスになる
Posted: 2009年10月01日(木) 00:41
by チルチル
見た感じ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:演算子?実行結果がエンドレスになる
Posted: 2009年10月01日(木) 00:53
by まりも
Maさん、真夜中に返答ありがとうございます。^^
num*2 で 表示すると 実行結果がエンドレスになってしまうのに
num *= 2 だと 実行結果が 2・4・8 でちゃんと終了しました。
・・・・・なんででしょう??
今はこういう実行結果を出したい!という視点ではなく(レベルでも無く・・・;;)
どんなきまりで計算(実行?)するんだろう?
って実行結果を見て確認しながら、理解を深めていっている段階です。
num*2 と num *= 2 はどう意味が違うんでしょう????
(違うんだなって事だけわかりました。^^)
Re:演算子?実行結果がエンドレスになる
Posted: 2009年10月01日(木) 01:03
by sizuma
num *= 2
これは
num = num * 2
ですよ。
Re:演算子?実行結果がエンドレスになる
Posted: 2009年10月01日(木) 01:10
by DVDM
>>まりもさん
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」の条件を満たし続けているため無限ループになります。
Re:演算子?実行結果がエンドレスになる
Posted: 2009年10月01日(木) 01:13
by base
それはforの増分のところがnum*2になっているとnum*2はただ計算されて=ではないのでnumに代入されないためだと思います。
Re:演算子?実行結果がエンドレスになる
Posted: 2009年10月01日(木) 01:14
by まりも
チルチルさん回答ありがとうございます。
回答頂けて、とってもうれしいです。
さっそく書いてもらったコードの通りに打ちなおしてみました。
でも結果が・・・・エンドレスに!!;;(なんで?どうしてなんだろう???)
main関数はまだ全然勉強してないので、
(今使用の参考書には ”とりあえずおまじないと覚えててください”と説明)
おいおい調べていきたいと思います。
ちなみにコンパイラは gcc というものを使用しています。
私の四則演算の理解がまだまだ足りないなのかなぁ・・・。
でも・・こうやって、答えてくれる人がいるだけで、頑張るエネルギーがもらえます。
ありがとうです。
Re:演算子?実行結果がエンドレスになる
Posted: 2009年10月01日(木) 01:33
by まりも
DVDMさんへ
「きゃあああ~」って思わず叫びたくなる位、わかりやすい回答でした。
「なんでエンドレスになっちゃうの????」にしっかり答えてくれて感激です。
baseさんが答えてくれた中の言葉「代入」と
DVDMさんの「格納」はたぶん同じ意味だと思うのですが、
今回のエンドレス解決のキーワードは
まさしくこの「格納」「代入」の概念でした。!!
= ・・・⇒ってすごい大事なキーワードだったんですねー!(しみじみ・・)
まだ始めたばっかりですが、進んだり、戻ったりしつつ 理解していきますね♪
問題がすっきり解決しました。
超初歩的な質問に答えて頂いてありがとうございました。
Re:演算子?実行結果がエンドレスになる
Posted: 2009年10月01日(木) 01:45
by まりも
・・・・またまた超初心者の質問でごめんなさい><
問題解決したので終了(解決マークを出)したいのですが、
ど・・どーしたらいいんでしょう??
初めて投稿したのでやり方がわかりません。・・・orz
ごめんなさい・・・。
Re:演算子?実行結果がエンドレスになる
Posted: 2009年10月01日(木) 04:15
by DVDM
>>まりもさん
コメントを掲示板に投稿する時に、下の方にあります
マーク □[color=red>解決![/color]
の所にチェックを入れたあと 「投稿」 ボタンを押すと解決マークが付きます。
[color=gray>
>baseさんが答えてくれた中の言葉「代入」と
>DVDMさんの「格納」はたぶん同じ意味だと思うのですが、 [/color]
私の中で変数は箱のイメージがあるため、
そこにモノ(値)を格納するという意味合いでこの言葉を使っています・・・
わかりにくい表現で申し訳ないです;
代入という意味で捉えて頂ければOKです。
Re:演算子?実行結果がエンドレスになる
Posted: 2009年10月01日(木) 08:03
by conio
>>チルチルさん
>>見た感じ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:演算子?実行結果がエンドレスになる
Posted: 2009年10月01日(木) 19:56
by まりも
DVDMさん
またまた 終了の仕方を教えてくれて感謝です。アリ(´・ω・)(´_ _)ガト♪
conioさん
おっしゃる通り 継続条件の所 num >= 10 は記述ミスでした。
num <= 10 が実際のコードです。
果てしなく繰り返し計算されちゃうこの状態を「無限ループ」って言うんですねぇ・・。
まだまだ知らない言葉がイッパイで「???」状態ですが、
一個一個用語を覚えていくのも、今は新鮮で楽しいです。
これからも頑張って楽しくC言語理解してこうと思います。
回答をくださった皆様ありがとうございました。
これにて〆ます。