• ベストアンサー

多分インクリメントがよく解ってないのかも

#include <iostream> using namespace std; int main() { int s = 1; for(int i=0; i<5; i++){ for(int k=0; k<s; k++){ cout << '*'; } cout << '\n'; s++; } return 0; } をコンパイラすると、 * ** *** **** ***** の様に出力されます。 この二つの**マークの所から、なぜ、そうなるのかが理解できません。 for(int k=0; k<s; k++){ の k<s;の所は最初、0<1;となって。*が一つ出力され、k++でkが1になり'\n'で改行され、 s++でsが2になり、1<2;となり出力の2行目に*が一つでます。でも1<2なので、\nになってしまいます。 しかし、この考え方は間違っているので、理解できないのです。 要点は**がどの様な手順で出力されているのかが解りません。 **が理解できれば***や、****も理解できると思います。 for(int k=0; k<s; k++){ cout << '*'; } のk++のインクリメントは{ }のブロック内の最後の地点で、1プラスになるのですよね? 

質問者が選んだベストアンサー

  • ベストアンサー
  • pikacchu
  • ベストアンサー率44% (11/25)
回答No.2

こんにちは。 1番目のforループで5回ループするのはOKですよね。 2番目のforループでは毎回k=0の初期化が実行されるので、2回目のループの時にはk<2が真の間(成り立つ間)cout<<'*'が実行されて'*'が2つ出力されますます。 3回目も同様に、k<3が真の間繰り返されるので、'*'が3つ出力されます。

yosiyosi
質問者

お礼

理解できました。ありがとうございました。

その他の回答 (1)

  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.1

> s++でsが2になり、1<2;となり出力の2行目に*が一つでます。 ここが違う。s が2になり、までは良いのだけれど、for(int k=0; k<s; k++) のところに来ると、 また k は0から始まります。だから   0<2 となり * が出力され   k++ されて 1<2 となり * が出力され   k++ されて 2<2 となり、ループを抜ける というのが s が2のとき。 # 分かり難かったら、わからない文書を指して補足願います

yosiyosi
質問者

お礼

理解できました。ありがとうございました。

関連するQ&A