我正在寻找一个最小二乘法的代码,我遇到了以下几行:
static double one = 1.0;
static double p1 = 0.1;
static double p5 = 0.5;
...
Run Code Online (Sandbox Code Playgroud)
我想知道为什么有人会定义一个staticfor 1.0.pi例如,我可以理解为某些东西,但是对于诸如1.0和0.1等的微不足道的数学价值?我认为这将使代码的可读性降低,但它可能还有其他一些我缺少的好处.
那么,这些定义是否有原因?或者,如果它没有与现代代码一起使用,那么旧的编译器是否有任何理由?我知道我正在查看的代码已从FORTRAN转换为C/C++.FORTRAN中是否有任何理由?
我知道我正在查看的代码已从FORTRAN转换为C/C++.FORTRAN中是否有任何理由?
FORTRAN对所有子例程参数使用pass-by-reference.但是,与其他具有pass-by-reference的语言不同,它仍然允许您将"rvalues"作为参数传递.在幕后,FORTRAN编译器转换代码如下:
CALL SUBFOO(X + Y, 4)
Run Code Online (Sandbox Code Playgroud)
像代码一样
TEMP1 = X + Y
TEMP2 = 4
CALL SUBFOO(TEMP1, TEMP2)
Run Code Online (Sandbox Code Playgroud)
这正是您的C++代码正在做的事情:创建变量以将指针(或引用)传递给子例程FORTRAN样式.
当然,这不是惯用的C或C++.通常,您会传递一个double by值.
(从我对这个问题的回答中复制的代码示例.)
用于
static double one = 1.0;
static double p1 = 0.1;
static double p5 = 0.5;
Run Code Online (Sandbox Code Playgroud)
对我来说没什么意义.如果用更有意义的东西命名变量,那将是有意义的.我看到的东西的价值如下:
static double defaultCoefficient = 1.0;
static double defaultRateOfIncrease = 0.1;
static double defaultRatio = 0.5;
Run Code Online (Sandbox Code Playgroud)
在第二组中,在代码中使用变量比使用相应的常量更有意义.
使它们保持不变会更有意义.
static double const defaultCoefficient = 1.0;
static double const defaultRateOfIncrease = 0.1;
static double const defaultRatio = 0.5;
Run Code Online (Sandbox Code Playgroud)
我知道我正在查看的代码已从FORTRAN转换为C/C++.
如果翻译是由程序完成的,那么为什么变量的命名方式是可以理解的.
如果翻译是由人工完成的,他们可能会遵循一些关于如何快速移动事物的指导原则,而不一定通过理解代码来创建有意义的变量名称.
我见过这种情况的一个案例是使用哈佛架构的一些(较旧的,嵌入式)平台.
假设我有一个(外部库)函数,它将一个指针作为参数:
void Foo(double *Bar);
Run Code Online (Sandbox Code Playgroud)
如果我想将常量传递给此函数,我显然不能直接写它.我必须像开场白那样做,所以我可以拿地址one为例.
Foo(&one);
Run Code Online (Sandbox Code Playgroud)
在某些哈佛平台上,const值被放入程序ROM或闪存而不是RAM中,因此无法使用ROM地址而不是所需的RAM地址.
然后使它成为一个全局(静态)变量,这样它就可以在启动代码中初始化一次(从ROM复制到RAM一次的值),而不是每次需要它时使它成为一个自动变量.
我承认一个利基用例.