2014-05-16 138 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可以使用“别名”