2014-05-16 137 views
0

我試圖做一個函數內部的計算,但我不知道爲什麼它不工作:簡單計算

int calculate(int x){ 
    x = x + 2; 
    return x; 
} 

int main(){ 
    int x = 0; 
    int i; 

    for(i=0;i<10;i++){ 
    calculate(x); 
    } 

    printf("i = %d, x = %d\n", i, x); 
} 

我明白,x爲0,每次經過的時候功能。但是,我該如何解決它? 據說我應該返回10,x應該返回20.

+1

我看到的唯一'return'不在該代碼中。 –

+0

因爲C pas參數爲值。對'x'的所有更改都是該函數的本地特性。您可以改用指針。 –

+0

如果您不願意切換到C++,可以將函數原型更改爲「void calculate(int&x)'。這會傳遞對'x'的引用,所以更改不再是局部的。 – ilent2

回答

1

變量可以互相影響。你不必確保你永遠不會在任何其他地方使用i,因爲恐懼會在你的for循環中混入i,因爲新的範圍會得到同名的新副本(就像兩個不同的人擁有相同的名稱時一樣名稱)。

要解決這個問題,您可以從計算函數中返回值。我把它命名爲x2清楚地從原始x區別開來:

int calculate(int x2){ 
    x2 = x2 + 2; 
    return x2; 
} 

int main(){ 
    int x = 0; 
    int i; 

    for(i=0;i<10;i++){ 
    x = calculate(x); 
    } 

    printf("i = %d, x = %d\n", i, x); 
} 
+0

在這種情況下,該函數只能是單行:'return x + 2;',因爲您要將新值賦給x無論如何 –

2

實際上,你可以通過你想改變,而不是值本身是整數的指針。在這種情況下,新的(增加的)整數將被存儲在定義範圍的原始範圍(實際上在完全相同的存儲點),在這種情況下,這是您的main函數。所以,你的代碼,應該是這樣的:

void calculate(int *x) 
{ 
    *x += 2; 
} 

int main(void) 
{ 
    int x = 0; 
    for (int i=0; i<10; i++) 
    { 
     calculate(&x); 
     printf("i=%d, x=%d\n", i, x); 
    } 
    return 0; 
} 

OUTPUT:

i=0, x=2 
i=1, x=4 
i=2, x=6 
i=3, x=8 
i=4, x=10 
i=5, x=12 
i=6, x=14 
i=7, x=16 
i=8, x=18 
i=9, x=20 
+0

也許'void calculate(...)' – ilent2

+0

謝謝修復! –

0

如果你想要使用X改變,你需要按引用傳遞它,而不是價值。

void calculate(int *x){ 
    *x = *x + 2; 
} 

int main(){ 
    int x = 0; 
    int i; 

    for(i=0;i<10;i++){ 
    calculate(&x); 
    } 

    printf("i = %d, x = %d\n", i, x); 
} 
0

你按值傳遞x,所以calculate只改變一個本地副本。當calculate返回時,結果將丟失。您需要從calculate返回修改後的值並將其分配給main中的某個值。

0

你正在傳遞x作爲一個值(即它被複制)。所以x裏面的calculate功能和x不一樣。因此,當您更改其值時,更改未反映在main中的x中。

以下是更可取的。請注意,您需要return來自計算函數的一個值,然後將它返回給某個值。

int calculate(int x){ 
    return x + 2;    /* CHANGED */ 
} 

int main(){ 
    int x = 0; 
    int i; 

    for(i=0;i<10;i++){ 
    x = calculate(x);  /* CHANGED */ 
    } 

    printf("i = %d, x = %d\n", i, x); 
} 
0

變化:

for(i=0;i<10;i++){ 
    calculate(x); 
} 

到:

for(i=0;i<10;i++){ 
    x = calculate(x); 
} 

你的函數返回一個值,所以你需要存儲在某個地方。

+0

哇人快速回答事情。我永遠不會在這個網站上獲得代表;( – Nathan

0

在功能你可以改變一兩件事,我想,可以將工作

詮釋計算(INT & X)

並保持休息其他事情一樣 基本上u可以使用「別名」