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

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

ただいまの
回答率

90.22%

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

解決済

回答 6

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,396

reotantan

score 262

分かりやすい説明で申し訳ありません。
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;

}

コード
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 6

checkベストアンサー

+2

まず for文 の記述がどういった仕様か理解したほうがよさそうです。
大雑把に書くとこんな感じです。
for(初期化部; 条件式; カウンタ処理部) {
  繰り返し実行される文;
     :
}
for文の 括弧内は、セミコロンで3つに分けられていますが、それぞれに意味があります。

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

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

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

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



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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/08/25 19:10

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

    キャンセル

+2

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+2

{}の中の処理の影響を受けますが、
printfのなかで足し算をしているi+1は結果をiに代入していないのでiの値が変わっていません。
printf("NO.%d:", i++ );
i = i+1;
printf("NO.%d:", i );
{}のなかのprintfを上記のようにiの値が変わるようにすると
ループ処理がおかしくなります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/08/25 18: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)と{文}がどのような手順で機能するのか説明していだけると嬉しいです

    キャンセル

  • 2015/08/25 18:59 編集

    認識のとおりです
    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 19:08

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

    キャンセル

  • 2015/08/25 19:09

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

    キャンセル

+1

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

    i = 0;
    if (i < num) {
        printf ("NO.%d:",i+1 );
        scanf("%d",&tmp);
        sum+=tmp;
    }
    i++;
    if (i < num) {
        printf ("NO.%d:",i+1 );
        scanf("%d",&tmp);
        sum+=tmp;
    }
    i++;
    :
    (続く)

つまり、for (a; b; c) {} の aは最初の一回だけ、bは処理を始める前の分岐判断、cは処理が終わった後に毎回実施、となります。つまり

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

その通りです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/08/25 19:11

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

    キャンセル

0

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

for文で足されたiの結果というのは{}の中には影響を及ぼさないという事でしょうか? 
影響を及ぼさなかったら
printf("NO.%d:",i+1 );は全部「No.1」と表示されるはずですが違いますよね?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/08/25 19:09

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

    キャンセル

0

括弧の中にあるprintf、scanf、sum+=tmp;は文にあたり、cよりも先に実行されるという理解で
あってますか?
はい、その通りです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/08/25 18:52

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

    キャンセル

  • 2015/08/25 19:10

    ありがとうございました

    キャンセル

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

  • ただいまの回答率 90.22%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る