魔术号码的原因

来源:互联网 发布:自制动漫头像的软件 编辑:程序博客网 时间:2024/04/29 19:59
当处理器遇到这种指令,再发生“标识”是由“substitution_text”。该标识符是传统上键入的所有大写字母,使用下划线表示空格。
考虑下面的代码片断:


#定义max_students_per_class 30
国际max_students = numclassrooms * max_students_per_class;
当你编译你的代码,处理器取代max_students_per_class所有实例的文本值30,然后编译成可执行文件。
你可能会同意,这是更直观的比使用一个魔术号码的原因有两个。max_students_per_class提供上下文是什么程序正在尝试去做的,即使没有评论。其次,如果最大学生每教室数量变化,我们只需要在一个地方改变max_students_per_class的价值,和max_students_per_class所有实例将在下次编译的新的文学价值所取代。
考虑到我们的第二个例子,使用#定义符号常量:





#定义max_students_per_class 30
#定义max_name_length 30
国际max_students = numclassrooms * max_students_per_class;
setmax(max_name_length);
在这种情况下,很明显,max_students_per_class和max_name_length拟独立价值,尽管它们共享相同的值(30)。
那么为什么不使用#定义使符号常量?至少有两个主要问题。
首先,因为宏是由预处理器解决,这与定义的值代替符号名,#定义符号常量不会显示在调试器(显示你实际的代码)。所以尽管编译器编译int max_students = numclassrooms×30;,在调试器中你会看到int max_students = numclassrooms * max_students_per_class;。你必须要找到max_students_per_class为了定义知道实际的价值是什么。这可以使你的程序更难调试。
其次,#定义的值总是具有全局范围(我们将谈论更多的节中的局部变量和全局变量)。这意味着一个价值#一段代码定义可能有命名冲突与价值#定义具有相同名称的另一段代码。
规则:避免使用#创建符号常量的定义
一个更好的解决方案:使用const变量
一个更好的方法来创建符号常量是通过使用const变量:


const int maxstudentsperclass { 30 };
const int maxnamelength { 30 };
这些将出现在调试器中,并遵循范围内的所有正常的变量规则。
规则:使用const变量你神奇的数字提供名称和背景。
在程序中使用符号常量
在许多应用中,一个给定的符号常量需要在您的代码中使用(不只是在一个位置)。这些可以包括物理或数学常数没有变化(如PI或阿伏伽德罗数),或应用程序特定的“调谐”值(如摩擦或重力系数)。而不是重新定义这些每一次都是需要的,最好将宣布他们曾经在一个中央位置,并使用它们需要的地方。这样,如果你需要改变他们,你只需要在一个地方改变他们。
有多种方式来促进这个在C++,但下面的可能是最简单的:
1)创建一个头文件来保存这些常量
2)在这个头文件中,声明一个命名空间(我们会更多地谈论这一课4.3b --命名空间)

3)添加所有的常数在命名空间(确保他们const)

乔尔说:“我没有看到过简单定义为普通老yenperdollar变这个的优势”
然后亚历克斯说:“正常的局部变量是受局部作用域规则,这意味着他们只能被访问的块中声明它们。如果你需要在不同的块中使用相同的常量,你必须在每一个你需要的地方声明它(这都是多余的,并把你的代码在错误的风险)。
我不懂这个。
如果我第一次声明(下面的例子)一个正常的本地变量,x的值被看作由以下所有代码块。不需要“const”。
你能给我们一个简单的代码的例子吗?所以,第一个“破”的版本只使用好的'正常的局部变量,然后固定版本使用const呢?










十一
十二
十三
十四
十五
十六
十七
十八
十九
使用命名空间;
x(100);
国际out1()
{
返回X + 1;
}
国际out2()
{
返回X + 2;
}
国际main()
{
cout << out1() << endl;
cout << out2() << endl;

0 0