2016-05-19 5 views
-4

私は最近試験をしましたが、ボーナスの質問がありました。私はそれを正しく得た唯一の人でした。私はクラスメートと同じくらい好奇心が強いです。答えが得られましたが、方法や理由はわかりません。説明が必要

は質問されました: 使用この配列:int a[5] = {5, 1, 15, 20, 25};

は、これらの変数を使用します。int i, j, m;

使用この基本コード:ありました3, 2, 15

i = /*Enter Code*/; 
j = /*Enter Code*/; 
m = /*Enter Code*/; 
printf("%d, %d, %d", i, j, m); 

この回答をゲット条件の束しかし、メインは、私たちはあなたに許可されていた配列と1つの '1'と変数ごとに1つの '++'が等しくなります。

私は試行錯誤して正しい答えを得ましたが、どのように正しいとどのように正しいのか分かりません。ここに私のコードです:

int main() 
{ 
    int a[5] = {5, 1, 15, 20, 25}; 
    int i, j, m; 
    i = ++a[1]; 
    j = a[1]++; 
    m = a[i++]; 
    printf("%d, %d, %d", i, j, m); 
    _getch(); 
    return 0; 
} 

私は正しい答えを得た方法について純粋に興味があります。どんな説明も素晴らしいだろう。

ありがとうございます。

+3

あなたは自分でコンパイルしてリンクした後に、デバッガでコードをステップ実行し、各ステップでvar値を検査しましたか? –

+0

@MartinJamesそれはあなたが意味するものなら、私は正しい答えを '3、2、15'にしました。私は本当にこの質問が何を求めているのか分からない。 – Moms

+1

「どうすれば正しいのか、どのように正しいのかわかりません」 - まだ実行していない場合は、デバッガでコードをステップ実行し、各ステップでvar値を調べます。 –

答えて

1

ので、ちょうど3つの文を見て:

i = ++a[1]; 

をこれが2からa[1]を変更し、iにその値を割り当てます。

j = a[1]++; 

これは2jを設定し、3からa[1]を変更します。

m = a[i++]; 

これは15mを設定し、3からiを変更します。

したがって、最終値は必要なもの、3, 2, 15に印刷されます。

デバッガでこれを実行した場合は、すべての変数を監視し、ステートメントごとに実行されることがわかります。誰が言ったように

+0

それは感謝しています。私は2と15がどのように達成されたかを知っていましたが、3ではありませんでした。 – Moms

1

、単に手動でデバッガを使用してコードをステップ実行、または:

冒頭

a[5] = {5, 1, 15, 20, 25} 

i = ++a[1];

a[5] = {5, 2, 15, 20, 25} 
i = 2 

ため、プリインクリメント++ます彼に影響を与える前にa [1]を修正する。

j = a[1]++;

a[5] = {5, 3, 15, 20, 25} 
i = 2 
j = 2 

後のポストインクリメント++は変更されますので、[1] jに彼に影響を与えました。 m = a[i++];

a[5] = {5, 3, 15, 20, 25} 
i = 3 
j = 2 
m = 15 

見せかけの時、iが2に等しくなるようにポストインクリメント[2] = 15これは、Mに気取り後、iの値を変更するので

++ aとa ++の違いを理解する必要があります(また、2つのインクリメントが行われる場合)。

関連する問題