2013-10-20 76 views
0

在这段代码中,我似乎得到零,我不太熟悉为什么我不能用我创建的函数来改变可变长度。任何帮助都可能有用。为什么函数不会改变变量?

 #include <stdio.h> 
double get_length(double a); 
int main(int argc, char* argv[]) 
{ 
    double length = 0; 
    get_length(length); 
    printf("%lf", length); 
    return 0; 
} 
double get_length(double a) 
{ 
    printf("What is the rectangle's length?\n"); 
    scanf("%lf", &a); 
    return a; 
} 

当打印返回0.0000

+4

作品作为意图:局部变量/函数参数不能在函数的返回中生存。 –

+0

C.调用'get_length(x);'中的函数常见的误解对'x'的值没有影响。 –

回答

6

你不是存储返回值。变化:

get_length(length); 

到:

length = get_length(length); 

没有必要通过length当你做到这一点。

的另一种方式做到这一点是通过一个地址:

#include <stdio.h> 

void get_length(double * a); 

int main(int argc, char* argv[]) { 
    double length = 0; 
    get_length(&length); 
    printf("%f", length); 
    return 0; 
} 

void get_length(double * a) { 
    printf("What is the rectangle's length?\n"); 
    scanf("%lf", a); 
} 

注意%f,不%lf,是在printf()一个double正确的格式说明。然而,使用%lf对于scanf()是正确的。

+1

解释,downvoter? –

+1

顺便说一下,最初的'double get_length(double a)'有点儿有趣:它基本上要求调用者初始化函数的局部变量'double a'。 –

+0

@Joker_vD:是的,保存了一行源代码,代价很大。 –

3

C是“按值传递”,这意味着该值实际上被复制。因此,通过使用引用来更改值实际上并不会更改原始引用。

这种情况有解决方法有两种:

1)存储到本地值,然后捕获返回值:

length = get_length() 
... 
double get_length() 
{ 
    double a; 
    printf("What is the rectangle's length?\n"); 
    scanf("%lf", &a); 
    return a; 
} 

2)传递一个指针:

get_length(&length) 
... 
double get_length(double *length) 
{ 
    printf("What is the rectangle's length?\n"); 
    scanf("%lf", length); 
}