双精度前的C期望值表达式



一直说在double int pt函数

之前有一个期望的表达式
 #include <stdio.h>
 int pt (int a, int b)
 {
    int c, result;
      c = (a * a) + (b + b);
        result = double sqrt (double c);
   return result;
 }
 int main (void)
 {
     int d, e, f;
     int pt (int a, int b);
     printf("type enter after input of the two legs");
     scanf("%i", &d);
     scanf("%i", &e);
     f = pt (d,e);
     printf("the hypotenuse is %i", f);
     return 0;
 }

变化

result = double sqrt (double c);

result = sqrt(c);

由于隐式转换,当您将c传递给sqrt函数时,您不必将其强制转换为double。如果您仍然想要进行cast,正确的方法是sqrt((double) c)

另外,#include <math.h>用于sqrt函数的使用。


注意:不需要将sqrt的返回类型强制转换为int(相关的,因为resultint类型)-但是一些编译器可能会给出关于隐式转换的警告(Credit to @MattMcNabb)。使用强制类型转换向其他编码器发出信号,表明精度损失是故意的,这也是一种很好的做法。

double sqrt (double c);函数声明。(它也是一个函数原型)。这是你宣布一个函数存在的方式,以及它接受什么参数和返回什么。c这个词在这里没有任何意义,可以省略。

当你想调用一个函数时,你不重复这个信息。你只需要给出函数名,后跟一个值列表,例如sqrt(c)

在你的代码中,sqrt没有被声明。函数必须在调用之前声明。不可能同时声明和调用一个函数;你得先申报。

(历史注释:从C99开始是这样的;在C89中,你可以调用一个未声明的函数,编译器会假设你希望函数声明返回int;这将导致任何没有实际返回int的函数的未定义行为。

你可以提供你自己的声明,只要它符合标准声明:

double sqrt(double);

然而,使用标准声明是一个更好的主意:

#include <math.h>

可以工作,因为文件math.h包含double sqrt(double);行(或类似的东西)。

那么你可以写:

result = sqrt(c);

注意,您不需要使用与此函数调用相关的任何强制类型转换。由于存在函数原型,编译器知道即使您提供了int,它也应该将该int转换为double(它知道如何做),反之亦然。

这是在谈论你正在做的选角吗?你的铸件抱怨它应该是这样的:

你的结果是一个整数,所以你应该将它强制转换为int。但是如果你想将任何东西强制转换为double,它应该像

result = (double)sqrt((double) c)也就是double(sqrt((double) c)

,但如果您想将其强制转换为int则结果= (int)sqrt((double) c)或结果= int(sqrt((double) c))希望这对你有帮助

最新更新