基本数据类型使用注意事项
数值(文字常量),整数,浮点数,字符,字符串,布尔变量,枚举类型,数组这些基本数据类型的使用注意事项:
(一)数值
(1)避免使用"神秘数值".
神秘数值是程序中出现的,没有经过解释的数值文字常量,如100,122。
可以用定义常量和全局变量的方法来代替神秘数值。
例如:
#define MAX 100
const int MAX = 100;
(2)预防除零错误
在除法的时候要考虑表达式的分母是否有可能为0。
(二)整数
(1)检查整数除法
例如:
7/10他不等于0.7,而是0,或者等于负无穷大。
在现实世界里10*(7/10) = (10*7)/10 = 7,但在整数运算中却不同。10*(7/10) = 0。
(2)整数溢出
在做整数乘法和加法的时候容易出现这种情况。
避免整数溢出的最简单方法是考虑算术表达式中的每个项,设想每个项的最大值,预料出结果。
(3)中间结果溢出
例如:
int a = 1000000;
int b = 1000000;
int product = a * b / 1000000;
结果是product = -727;是不是跟预想的结果不一样。问题是出现在a * b这里,a * b的结果就已经大于了整数的最大取值范围。
(三)浮点数
(1)避免相差很大的两个浮点数相加减
例如:
1000000.00 + 0.1 可能等于的是1000000.00,因为32位不能给你足够的有效位数包容1000000和0.1之间的数值区间。
(2)避免等量判断
很多应该相等的浮点数值并不一定相等。
例如:
C#代码
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
double nominal = 1.0;
double sum = 0.0;
for (int i = 0; i < 10; i++)
{
sum += 0.1;
}
if (nominal == sum)
{
Console.WriteLine("same");
}
else
{
Console.WriteLine("differnt");
}
}
}
}
这段程序的结果是different。
(3)舍入误差问题
解决方案:
1.使用精确度更高的变量类型。
2.换用二进制编码的十进制变量。
3.把浮点变量变成整型变量。
(四)字符和字符串
(1)不要使用神秘字符和字符串。
(2)访问字符串时避免溢出。
(3)知道你的语言和开发环境如何支持Unicode.
(五)布尔变量
(1)用布尔变量对程序加以文档说明
例如:
if ((elementIndex < 0) || (MAX_ELEMENTS < elementIndex) || (elementIndex == lastElementIndex))
{.....}
这段代码布尔判断目的不明确,如果该成下面这样就比较明确了。
bool finished = (elementIndex < 0) || (MAX_ELEMENTS < elementIndex);
bool repeatedEntry = (elementIndex == lastElementIndex);
if (finished || repeatedEntry ){....}
(六)枚举类型
(1)枚举可以提高可读性。
例如:
if (color == 1)
if (color == Color_red)
相比之下第二条语句可读性就高。
(2)枚举可以提高可靠性。
使用枚举使编译器执行很严格的类型检查。
例如:
enum Color
{
Color_red,
Color_blue,
Color_black,
};
声明了一个枚举类型Color,如果声明了一个Color类型的变量c,编译器只能允许Color_red,Color_blue,Color_black这3个值付给c。
(3)枚举可以简化修改。
就拿上边的Color来说吧,如果以后程序想添加一些颜色只需往列表中增加元素即可,编译以后就可以运行了。
(七)数组
(1)确认所有数组下标都没有超出数组的边界。
(2)如果数组是多维的,确认下标使用顺序的正确的。
(3)提防下标串换串话。
这种情况出现在使用嵌套循环的时候,不要把Array[i]写成Array[j]。
以上是我看过资料自己整理出来的结果,如有不对希望大家指出来。如果不全请大家跟贴补充上来。
(一)数值
(1)避免使用"神秘数值".
神秘数值是程序中出现的,没有经过解释的数值文字常量,如100,122。
可以用定义常量和全局变量的方法来代替神秘数值。
例如:
#define MAX 100
const int MAX = 100;
(2)预防除零错误
在除法的时候要考虑表达式的分母是否有可能为0。
(二)整数
(1)检查整数除法
例如:
7/10他不等于0.7,而是0,或者等于负无穷大。
在现实世界里10*(7/10) = (10*7)/10 = 7,但在整数运算中却不同。10*(7/10) = 0。
(2)整数溢出
在做整数乘法和加法的时候容易出现这种情况。
避免整数溢出的最简单方法是考虑算术表达式中的每个项,设想每个项的最大值,预料出结果。
(3)中间结果溢出
例如:
int a = 1000000;
int b = 1000000;
int product = a * b / 1000000;
结果是product = -727;是不是跟预想的结果不一样。问题是出现在a * b这里,a * b的结果就已经大于了整数的最大取值范围。
(三)浮点数
(1)避免相差很大的两个浮点数相加减
例如:
1000000.00 + 0.1 可能等于的是1000000.00,因为32位不能给你足够的有效位数包容1000000和0.1之间的数值区间。
(2)避免等量判断
很多应该相等的浮点数值并不一定相等。
例如:
C#代码
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
double nominal = 1.0;
double sum = 0.0;
for (int i = 0; i < 10; i++)
{
sum += 0.1;
}
if (nominal == sum)
{
Console.WriteLine("same");
}
else
{
Console.WriteLine("differnt");
}
}
}
}
这段程序的结果是different。
(3)舍入误差问题
解决方案:
1.使用精确度更高的变量类型。
2.换用二进制编码的十进制变量。
3.把浮点变量变成整型变量。
(四)字符和字符串
(1)不要使用神秘字符和字符串。
(2)访问字符串时避免溢出。
(3)知道你的语言和开发环境如何支持Unicode.
(五)布尔变量
(1)用布尔变量对程序加以文档说明
例如:
if ((elementIndex < 0) || (MAX_ELEMENTS < elementIndex) || (elementIndex == lastElementIndex))
{.....}
这段代码布尔判断目的不明确,如果该成下面这样就比较明确了。
bool finished = (elementIndex < 0) || (MAX_ELEMENTS < elementIndex);
bool repeatedEntry = (elementIndex == lastElementIndex);
if (finished || repeatedEntry ){....}
(六)枚举类型
(1)枚举可以提高可读性。
例如:
if (color == 1)
if (color == Color_red)
相比之下第二条语句可读性就高。
(2)枚举可以提高可靠性。
使用枚举使编译器执行很严格的类型检查。
例如:
enum Color
{
Color_red,
Color_blue,
Color_black,
};
声明了一个枚举类型Color,如果声明了一个Color类型的变量c,编译器只能允许Color_red,Color_blue,Color_black这3个值付给c。
(3)枚举可以简化修改。
就拿上边的Color来说吧,如果以后程序想添加一些颜色只需往列表中增加元素即可,编译以后就可以运行了。
(七)数组
(1)确认所有数组下标都没有超出数组的边界。
(2)如果数组是多维的,确认下标使用顺序的正确的。
(3)提防下标串换串话。
这种情况出现在使用嵌套循环的时候,不要把Array[i]写成Array[j]。
以上是我看过资料自己整理出来的结果,如有不对希望大家指出来。如果不全请大家跟贴补充上来。