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