質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

6回答

2653閲覧

for()に続く波括弧の意味

reotantan

総合スコア295

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

1クリップ

投稿2015/08/25 09:27

編集2015/08/25 09:47

分かりやすい説明で申し訳ありません。
for(a;b;c){printf
}とあってaが評価され、Bが評価されiが+されたらこの時点でiは1ですよね。
その後にprintfが来てi+1を表示しろといったら2を表わすのではないかと考えました。
ただ本にはa→b(これが成立する限り)→文(printfのこと?)→cとありました。
括弧の中にあるprintf、scanf、sum+=tmp;は文にあたり、cよりも先に実行されるという理解で
あってますか?

int main(void){ int i; int sum=0; int num,tmp; printf("how many integers?" );scanf("%d",&num ); for(i=0;i<num;i++){ printf("NO.%d:",i+1 );scanf("%d",&tmp); sum+=tmp; } printf("sum is %d\n",sum ); printf("average is%.2f\n",(double)sum/num ); return 0; } コード

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答6

0

ベストアンサー

まず for文 の記述がどういった仕様か理解したほうがよさそうです。
大雑把に書くとこんな感じです。

C

1for(初期化部; 条件式; カウンタ処理部) { 2 繰り返し実行される文; 3 : 4}

for文の 括弧内は、セミコロンで3つに分けられていますが、それぞれに意味があります。

・繰り返し処理に関連する変数の初期化部分
・繰り返しの条件判定部分
・繰り返し条件に関連するカウンタ処理部分

for文は基本的にカウンタを用いた有限回数の繰り返し処理を行う場合に用います。
※似たようなものとして while文がありますが、こちらはカウンタを用いないような場面に対応しやすい記述仕様です。

重要なことを書いてませんでした…。
処理順序ですが、この順序で実行されます。

・初期化処理を実行(※最初に1回だけ実行する)
・条件式の判定
・繰り返し実行される文の実行
・カウンタ処理部分の実行
・(以下、条件式の判定に戻って繰り返す)


質問の 「i+1」 の意図ですが、単純に1から数えるのを目的にしています。

1を足さなかった場合は0から数え上げますが、一般的に数を数える場合1からですよね。
単純にそのズレを補正するために行っています。

0から数えてもOKなら不要ですが…最初に「何個入力するか」と聞かれて、仮に「5」と入れた場合に「0〜4」と数えられるのも変な感じですよね。

投稿2015/08/25 09:52

編集2015/08/25 09:58
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

reotantan

2015/08/25 10:10

丁寧なご説明ありがとうございました。 for文をしっかりと理解できました
guest

0

{}の中の処理の影響を受けますが、
printfのなかで足し算をしているi+1は結果をiに代入していないのでiの値が変わっていません。

C

1printf("NO.%d:", i++ );

C

1i = i+1; 2printf("NO.%d:", i );

{}のなかのprintfを上記のようにiの値が変わるようにすると
ループ処理がおかしくなります。

投稿2015/08/25 09:35

kutsulog

総合スコア985

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

reotantan

2015/08/25 09:51

1はい、printfの中でiに何をしてもi自体が変化することがないのは理解できます。 しかし、for(i=0;i<num;i++)でiを0と定義し、それにi++をしたらこの時点で1ですよね そしてそのiをprintfでi+1としているために、 NO2 NO3 NO4と始まるのではないのかなと考えました。 for(a;b;c)と{文}がどのような手順で機能するのか説明していだけると嬉しいです
kutsulog

2015/08/25 10:05 編集

認識のとおりです forを使わず繰り返し処理をつらつら書くと i = 0;/*a*/ if(i /*0*/< num/*b*/){ 文; i++; /*c(i:0->1)*/} if(i /*1*/< num/*b*/){ 文; i++; /*c(i:1->2)*/ } if(i /*2*/< num/*b*/){ 文; i++; /*c(i:2->3)*/ } if(i /*3*/< num/*b*/){ 文; i++; /*c(i:3->4)*/ } if(i /*4*/< num/*b*/){ 文; i++; /*c(i:4->5)*/ } if(i /*5*/< num/*b*/){ 文; i++; /*c(i:5->6)*/ } : //(i == numまで) こんな感じになります これでイメージがつかめますでしょうか?
退会済みユーザー

退会済みユーザー

2015/08/25 10:08

for()の3番目`i++`は、forループを一巡したら実行する部分なのです。 `i=0`実行してすぐではありません。
reotantan

2015/08/25 10:09

具体的にありがとうございます。とても理解に役立ちました
guest

0

forループでiの値はゼロから始まります。
scanf文でnumに例えば10が入力されたら、
forループでiが取りうる値は0,1,2,...,8,9です。
printf文でi+1としているのは、表示用に一時的な値として
1,2,3,...,9,10を得たいからだと思われます。

投稿2015/08/25 09:32

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ご質問にあるforブロックと同じ処理をループ抜きで書くと次のようになるとイメージしてください(厳密にはちょっと違いますがあくまでイメージということで)。

C

1 i = 0; 2 if (i < num) { 3 printf ("NO.%d:",i+1 ); 4 scanf("%d",&tmp); 5 sum+=tmp; 6 } 7 i++; 8 if (i < num) { 9 printf ("NO.%d:",i+1 ); 10 scanf("%d",&tmp); 11 sum+=tmp; 12 } 13 i++; 14 : 15 (続く) 16 ``` 17 18つまり、for (a; b; c) {} の aは最初の一回だけ、bは処理を始める前の分岐判断、cは処理が終わった後に毎回実施、となります。つまり 19 20> 括弧の中にあるprintf、scanf、sum+=tmp;は文にあたり、cよりも先に実行されるという理解で 21あってますか? 22 23その通りです。

投稿2015/08/25 10:03

KoichiSugiyama

総合スコア3041

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

reotantan

2015/08/25 10:11

分かりやすい説明ありがとうございます。 とても理解しやすく、助かりました。
guest

0

括弧の中にあるprintf、scanf、sum+=tmp;は文にあたり、cよりも先に実行されるという理解で

あってますか?
はい、その通りです。

投稿2015/08/25 09:49

tanat

総合スコア18711

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

reotantan

2015/08/25 09:52

なるほど、そうでしたか {}の中にはいくつ文章を入れてもいいんですか?
reotantan

2015/08/25 10:10

ありがとうございました
guest

0

for(A;B;C)
A:for文に入るときに評価される
B:繰り返しの最初(入るとき含む)で評価される
C:繰り返しの終わりで評価される

for文で足されたiの結果というのは{}の中には影響を及ぼさないという事でしょうか?

影響を及ぼさなかったら
printf("NO.%d:",i+1 );は全部「No.1」と表示されるはずですが違いますよね?

投稿2015/08/25 09:39

ozwk

総合スコア13521

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

reotantan

2015/08/25 10:09

そうですね、やっと理解できました。ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問