我想问一个关于从函数返回值的新手问题,这是我的简单程序:
#include <stdio.h>
double calcule(double r1,double r2, double r3)
{
double serie;
double parallele;
serie = r1 + r2 + r3;
parallele = (r1*r2*r3)/(r1*r2+r1*r3+r2*r3);
double results[2] = {serie,parallele};
return *results;
}
int main()
{
double r1;
double r2;
double r3;
printf("Veuillez entrez les valeurs R1,R2 et R3");
scanf("%lf",&r1);
scanf("%lf",&r2);
scanf("%lf",&r3);
double res[1] = {calcule(r1,r2,r3)};
printf("Si les resistances sont branchées en série la resistance equivalente est : %f",res[0]);
printf("Si les resistances sont branchés en parallele la resistance equivalente est : %f",res[1]);
return 0;
}
我的问题是为什么我必须做“返回*结果;”而不只是做“返回结果”; ?
答案 0 :(得分:2)
我在您的代码中发现了多个问题。
a)在函数计算中声明的数组变量'results'的范围仅限于函数本身。一旦程序完成执行语句块(函数),结果指向的变量位置就不再有效。尝试访问其范围后的结果指向的位置有时会导致访问冲突错误。
b)您在令您满意的位置声明变量。您的代码与C99 std编译良好,但在使用c89和c90编译时会受到影响。最好在块的开头执行所有类型声明语句以便于移植。
#include "stdio.h"
double calcule(double r1,double r2, double r3) {
double serie;
double parallele;
serie = r1 + r2 + r3;
parallele = (r1*r2*r3)/(r1*r2+r1*r3+r2*r3);
double results[2] = {serie,parallele}; /* a) scope is restricted to this block */
return *results;
}
int main() {
double r1;
double r2;
double r3;
printf("Veuillez entrez les valeurs R1,R2 et R3");
scanf("%lf",&r1);
scanf("%lf",&r2);
scanf("%lf",&r3);
double res[1] = {calcule(r1,r2,r3)}; /* b) type declaration not allowed here in c89/c90 */
printf("Si les resistances sont branchées en série la resistance equivalente est : %f",res[0]);
printf("Si les resistances sont branchés en parallele la resistance equivalente est : %f",res[1]);
return 0;
}
而不是我编写代码,我会给你功能原型。您可以使用它们来构建您的功能。
void calcule(double r1, double r2, double r3, double *output);
int main (void){
...
double output[2];
calcule(r1,r2,r3,output);
...
}
答案 1 :(得分:1)
*result
== return[0]
所以:
return *results;
是:
return results[0];
相当于:
return serie;
serie
是结果数组中的第0个元素。
我对你的代码了解不多,但你的calcule()
函数正在做的有用的东西等同于
double calcule(double r1,double r2, double r3)
{
return r1 + r2 + r3; // because serie = r1 + r2 + r3;
}
因为所有其他变量都是函数的本地变量。
注意:虽然如果返回result
,函数的返回类型是double,但这将是一个错误,因为结果是double(但不是double)的数组。此外,通过返回结果,您将返回导致代码中出现未定义行为的本地对象的地址。
答案 2 :(得分:0)
因为你的函数的返回类型是double
。 *results
的类型为double
,而results
的类型指针为double,即double *
,因此您无法从返回类型定义的函数返回指针为double
。
答案 3 :(得分:0)
该函数返回类型为double
的单个值。值results
是包含两个double
值的数组。返回*results
相当于返回results[0]
,即数组中的第一个元素。