魔术号码的原因
来源:互联网 发布:自制动漫头像的软件 编辑:程序博客网 时间: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 --命名空间)
考虑下面的代码片断:
一
二
#定义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
- 魔术号码的原因
- 为什么得不到本机号码的原因
- android 5.0 上拨打紧急号码无通话记录的原因
- php的魔术函数和魔术常量
- php的魔术函数和魔术常量
- PHP的魔术函数和魔术常量
- PHP的魔术变量及魔术方法
- PHP的魔术常量和魔术方法
- Apache的魔术
- cyril的神奇魔术
- 火的魔术
- php的魔术方法
- 魔术演员的风格
- PHP6 的“魔术常量”
- php的魔术方法
- php的魔术方法
- PHP 的“魔术常量”
- PHP的魔术世界
- 水~~~水仙花数
- Codeforces 553A Kyoya and Colored Balls【思维】
- 简单分析uboot启动内核
- 如果我要对oracle某个用户数据库下的很多表进行truncate,有没有简答的方式?我这是比较节省时间的方式
- Mysql的索引
- 魔术号码的原因
- Android静默安装实现方案
- KVM异常处理流程源码简要分析
- 超实用的mysql自动备份脚本
- Spark 读取Hbase表数据并实现类似groupByKey操作
- jabcType转成java中的字段类型
- 在JqGrid表格中自动生成按钮
- Android WindowManager 窗口泄漏的解决记录
- 项目经理成长三部曲