OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

C言語

  • すぐに回答を!
  • 質問No.102785
  • 閲覧数28
  • ありがとう数0
  • 気になる数0
  • 回答数5
  • コメント数0

/*test1*/
main()
{
static int data[] = {1,2,3,4,5,6,7,8,9};
int i,ct = 0;
i = 2;
while(i < 8){
ct += data[i];
i++;
}
printf("%d",ct);
}

/*test2*/
main()
{
int i = 0, j =0, ct = 0;
while(i < 5)
ct = ct + (++i) + (j++);
printf("%d",ct);
}

上記のプログラムで、test1は33、test2は25という実行結果になります。私が分からないのは、test1のwhile(i < 8)ではdata[7]まで数え、test2のwhile(i < 5)ではiが5になるまで数える事です。問題集をやっていて疑問に思ったのですが解答だけが載っており説明が載っていなかったので質問しました。理解されてるかたには簡単すぎる質問ですがよろしくお願いします。
通報する
  • 回答数5
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.4
レベル12

ベストアンサー率 75% (398/526)

 単項演算子++と--には、「前置」と「後置」という使い方が存在します。

 前置とは「++i」のように変数の前につける方法で、式全体を評価する前に変数の値を変化させます。
 また、後置とは「i++」のように変数の後ろにつける方法で、式全体を評価した後に変数の値を変化させます。

 つまり、
   i = 0;
   a = ++i;
   printf("a=%d, i=%d\n", a, i);
の結果は「a=1, i=1」となり、
   i = 0;
   a = i++;
   printf("a=%d, i=%d\n", a, i);
の結果は「a=0, i=1」となります。

 ただし、1つの式の中で、1つの変数の値を2回変更するような記述をしてはいけません。つまり、
   a = (i++) * (++i);
のような式は、書いてはいけないということです。
 なぜなら、このような使い方をした場合の動作はCの仕様では定義されておらず、処理系によって結果が異なる恐れがあるからです。
(処理系に依存したプログラムは移植性に欠け、見つけにくいバグを生み出します。)
 ですから、複雑な式の中で++などを行う必要がある場合は、確実に意図した通りに実行されるよう式を分解するのが、バグを防ぐ最良の手段です。
-PR-
-PR-

その他の回答 (全4件)

  • 回答No.1

それは一言で言ってしまうと、 「i++」と「++i」の差です。 i++は、その数値を参照してから1加えてるのに 対し、 ++iは、1を加えたものを参照しているということです。 つまり、Test2のプログラムのiの参照の仕方は、 1,2,3,4,5となり、5で抜けるって感じになる ってことです。 どうでしょうか?後参照にしたのURLを見ていただければ 違いは一目瞭然かと. ...続きを読む
それは一言で言ってしまうと、
「i++」と「++i」の差です。
i++は、その数値を参照してから1加えてるのに
対し、
++iは、1を加えたものを参照しているということです。
つまり、Test2のプログラムのiの参照の仕方は、
1,2,3,4,5となり、5で抜けるって感じになる
ってことです。

どうでしょうか?後参照にしたのURLを見ていただければ
違いは一目瞭然かと.
  • 回答No.2
レベル12

ベストアンサー率 45% (207/457)

++i と j++ では計算順序が異なるのでね test2の ct = ct + (++i) + (j++) の場合 ++iを計算してctに足すけど j++はctにjの値を足してからjに値を+1してるのですよ。 だから iの値は1,2,3,4,5と言う値をctに足し jの値は0,1,2,3,4と言う値をctに足しているから25という答えになるのです。 test1は配列の最初の値 ...続きを読む
++i

j++
では計算順序が異なるのでね
test2の
ct = ct + (++i) + (j++)
の場合
++iを計算してctに足すけど
j++はctにjの値を足してからjに値を+1してるのですよ。
だから
iの値は1,2,3,4,5と言う値をctに足し
jの値は0,1,2,3,4と言う値をctに足しているから25という答えになるのです。

test1は配列の最初の値はdata[0]に入っているからですね
足す値は3,4,5,6,7,8で33という答えです。

最近Cを使っていないの間違ってたらすまんです。
  • 回答No.3
レベル10

ベストアンサー率 17% (31/179)

まずtest1ですが iは8までカウントされています。 プログラムの流れとして  ・i<8のチェック  ・ctの計算  ・iを増やす の繰り返しです iが8になったときは先頭のチェックではじかれるため ctの計算は通らなくなるので実質data[0]~data[7]の 和が作成されます test2の時の3つの変数の変化はctを計算しているときに ct i j  0 ...続きを読む
まずtest1ですが
iは8までカウントされています。

プログラムの流れとして
 ・i<8のチェック
 ・ctの計算
 ・iを増やす
の繰り返しです
iが8になったときは先頭のチェックではじかれるため
ctの計算は通らなくなるので実質data[0]~data[7]の
和が作成されます


test2の時の3つの変数の変化はctを計算しているときに
ct i j
 0 0 0
 0 1 0
 1 2 1
 4 3 2
 9 4 3 *
16 5 4

iとjの増えるタイミングに注意してください
式中の ++i は式の計算よりもインクリメントが優先されます
逆に  j-- は式の計算に使われた後でインクリメントされます。

test1もtest2もiは比較してる数値まで増えているのですが
増えるタイミングによってそのように見えているのです




 
  • 回答No.5
レベル10

ベストアンサー率 17% (31/179)

ANo3の値がチョッと変なので訂正 ・i<8のチェック時の値   ・ctを求めるときの値 ct  i  j        ct  i  j  計(ct)  0  0  0                0  1  0   1  1  1  1                       1  2  1   4  4  2  2                4  3  2   9 ...続きを読む
ANo3の値がチョッと変なので訂正

・i<8のチェック時の値   ・ctを求めるときの値
ct  i  j        ct  i  j  計(ct)
 0  0  0
               0  1  0   1
 1  1  1       
               1  2  1   4
 4  2  2
               4  3  2   9
 9  3  3
               9  4  3   16
16   4  4       
               16  5  4   25
25   5  5 <―この時のチェックでループが終わる


以上訂正でしたiとjの増えるタイミングの問題です
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ