/*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になるまで数える事です。問題集をやっていて疑問に思ったのですが解答だけが載っており説明が載っていなかったので質問しました。理解されてるかたには簡単すぎる質問ですがよろしくお願いします。
No.4ベストアンサー
- 回答日時:
単項演算子++と--には、「前置」と「後置」という使い方が存在します。
前置とは「++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の仕様では定義されておらず、処理系によって結果が異なる恐れがあるからです。
(処理系に依存したプログラムは移植性に欠け、見つけにくいバグを生み出します。)
ですから、複雑な式の中で++などを行う必要がある場合は、確実に意図した通りに実行されるよう式を分解するのが、バグを防ぐ最良の手段です。
No.5
- 回答日時:
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の増えるタイミングの問題です
No.3
- 回答日時:
まず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.2
- 回答日時:
++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.1
- 回答日時:
それは一言で言ってしまうと、
「i++」と「++i」の差です。
i++は、その数値を参照してから1加えてるのに
対し、
++iは、1を加えたものを参照しているということです。
つまり、Test2のプログラムのiの参照の仕方は、
1,2,3,4,5となり、5で抜けるって感じになる
ってことです。
どうでしょうか?後参照にしたのURLを見ていただければ
違いは一目瞭然かと.
参考URL:http://www.kumei.ne.jp/c_lang/intro/no_11.htm
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VB6.0-整数と余りを求める
-
Excel-vba 文字列と変数を...
-
フォームを開くときに、コンボ...
-
C言語 exitの使い方
-
C#の問題で2つの整数a,bの...
-
DataGridView 複数行同時変更...
-
VBAの定数の使い方で、計算値を...
-
数字の位ごとの値を表示するプ...
-
関数で複数の値を戻り値として...
-
C言語でCLAMP(a,b,c)
-
4択問題のプログラムでランダム...
-
C#で動的にコントロールを取得...
-
C#.netでの切り上げ処理について
-
Excel VBAで値貼り付けのプログ...
-
足して100になるような乱数のア...
-
配列の値を置換するにはどうす...
-
Borland C++ Compiler 5.5の警...
-
整数xxxが大き過ぎますというエ...
-
VBAでダブルコーテーション入り...
-
コマンドプロンプト バッチ|結...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語 exitの使い方
-
フォームを開くときに、コンボ...
-
Excel-vba 文字列と変数を...
-
VB6.0-整数と余りを求める
-
足して100になるような乱数のア...
-
VBAの定数の使い方で、計算値を...
-
DWORDって
-
世界のナベアツ
-
VBAで配列のNULL判定
-
C#で動的にコントロールを取得...
-
数字の位ごとの値を表示するプ...
-
long型のランダムな値を返す方法
-
UWSCのcallについて
-
フリーランタイマーの時間差分...
-
1つ前の値を変数に保存する方法
-
VB6でのLog
-
C言語でCLAMP(a,b,c)
-
DataGridView 複数行同時変更...
-
コンボボックスの名前を変数に...
-
バッチファイルで正規表現を使...
おすすめ情報