如何解决C4244警告:sqrt返回double转int丢失数据的问题
修复C4244警告:double转int的类型转换问题
你的问题根源在于用sqrt()函数计算数组边长——这个函数返回double类型,赋值给int变量时必然触发类型转换警告,而你的编译环境把警告当成错误导致失败。更关键的是,用sqrt()计算静态二维数组的边长完全是多余的,静态数组的大小是编译期已知的,直接用整数运算就能得到正确的边长,根本不需要浮点运算。
最优修复方案
直接通过sizeof计算二维数组的行数(对于N×N数组来说,行数就是边长):
int ArrayLength = sizeof(arr) / sizeof(arr[0]);
sizeof(arr):整个二维数组的总字节数sizeof(arr[0]):数组中一行的字节数
两者相除得到的是数组的行数,对于3×3数组来说结果就是3,是纯整数运算,完全没有类型转换问题。
修改后的完整代码
#include <iostream> #include <fstream> #include <string> #include <cmath> using namespace std; int main() { int arr[3][3]{ {11, 2, 4}, {4, 5 ,6}, {10, 8, -12} }; // 用整数运算直接获取N×N数组的边长 int ArrayLength = sizeof(arr) / sizeof(arr[0]); int difference{ 0 }; int primaryDiagonal = arr[0][0]; for (int i = 1; i < ArrayLength; i++) { primaryDiagonal += arr[i][i]; } int secondaryDiagonal = arr[0][ArrayLength - 1]; for (int i = 1; i < ArrayLength; i++) { secondaryDiagonal += arr[i][ArrayLength - i - 1]; } difference = primaryDiagonal - secondaryDiagonal; cout << abs(difference); return 0; }
为什么原来的方式不可取?
- 类型转换风险:
sqrt()返回浮点值,转int时会丢失精度(比如如果数组大小不是完全平方数,结果会出错) - 运行时开销:
sqrt()是运行时函数,而静态数组的大小编译期就能确定,完全没必要用运行时计算 - 通用性差:如果后续修改数组为非正方形(比如3×4),用
sqrt()的方式会直接得到错误的边长,而sizeof(arr)/sizeof(arr[0])依然能正确获取行数
内容的提问来源于stack exchange,提问作者Henawy
相关产品推荐
相关产品推荐

