2011-09-16 6 views
1
#include<stdio.h> 

int i; 
int increment(int i) 
{ 
    return ++i; 
} 

int main() 
{ 
    for(i=0;i<10;increment(i)) 
    { 
     printf("%d",i); 
    } 
    return 0; 
} 

出力は000000です。つまり、無限大のループが発生します。はこれですか?

++ i(インクリメント関数によって返された)の値を格納する変数がないか、何か他の理由があるため、これはノーオペレーションのために発生していますか? 。説明してください。

+0

「for(i = 0; i <10; i =インクリメント(i))」と比較し、[Call by Value](http://en.wikipedia.org/wiki/Evaluation_strategy#Call_by_value)ファンクションまたはプロシージャがそのパラメータに値を割り当てることができる場合、ローカルコピーのみが割り当てられます。つまり、ファンクションコールに渡されたものは、ファンクションが戻ったときにコール元のスコープ内で変更されません。 –

答えて

12

はい、それはノーオペレーションです。値が値渡しであるため、incrementの呼び出しは何も変更されません。

ローカル定義iはグローバル定義をシャドウします。したがって、iのローカル定義のみが使用され、iのグローバル定義は、変数のローカルコピーで行われる増分の影響を受けません。

+0

@Mystical:あなたが値渡しのため、それはノーオペレーションであると言っています。それでなぜ私たちが書くのですか?(なぜ、インクリメントのパラメータが 'x'だったのかは同じです。 (i = 0; i <10; i =インクリメント(i))の場合、なぜ0から10までの値が出力されるのですか? –

+3

関数 'increment'は、シャドーイングとパスにより' i'の値を変更しません値によって。ただし、新しい値が返されます。だから、あなたが 'i'にそれを割り当てれば、それは増分されます。あなたがそれを割り当てなければ、何も起こらず、 '私は同じままです。 – Mysticial

2

増分される変数は、増分に渡される引数のローカルコピーです。あなたは両方ともiという名前をつけましたので、あまり明確ではないかもしれませんが、内のiは、グローバルに定義されたものと同じではありません。

関連する問題