马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
x 和 y是int类型,在整个程序中也一直是int类型。但是调用sqrt返回的是double类型,为什么没有把x或y强制转换成double类型呢?我印象中 长类型给短类型赋值好像自动强制转换的呢?求大佬详细展开说说。#include<stdio.h>
#include <math.h>
int main()
{
long int i, x, y;
for (i=1;i<100000;i++)
{
x = sqrt(i+100); /*x为加上100后开方后的结果*/
y = sqrt(i+268); /*y为再加上168后开方后的结果*/
if(x*x==i+100&&y*y==i+268)
{
printf("\n%ld\n",i);/*如果一个数的平方根的平方等于该数,这说明此数是完全平方数*/
}
}
return 0;
}
在这段代码中,sqrt() 函数的返回类型确实是 double,但实际上你并没有强制转换 x 或 y 为 double 类型。x 和 y 被赋予了 sqrt() 函数返回的 double 类型值,但这里发生了隐式类型转换,即将 double 类型转换为 long int 类型。这种转换可能会导致精度损失。
当一个表达式中出现了不同类型的操作数时,编译器会自动将较短类型的操作数转换为较长类型的操作数,以确保计算结果的正确性。这个过程叫做类型提升。在这里,sqrt() 函数返回的是 double 类型,而 x 和 y 是 long int 类型,所以发生了隐式类型转换,将 double 类型转换为 long int 类型。
你提到的长类型给短类型赋值时的自动强制转换其实就是这个隐式类型转换的过程。在这种情况下,编译器可能会发出警告,因为这种转换可能会导致精度损失。
如果你想避免隐式类型转换,可以显式地进行类型转换。例如,你可以使用强制类型转换 (C-style cast) 或者 C++ 风格的类型转换 (如 static_cast<double>(x) ) 来将 x 或 y 转换为 double 类型。然后,你可以将转换后的 double 类型值与其他 double 类型值进行运算,以确保计算结果的正确性。
|