为什么使用静态"常量"而不是实际值?

tri*_*e_r 8 c c++

我正在寻找一个最小二乘法的代码,我遇到了以下几行:

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中是否有任何理由?

dan*_*n04 6

我知道我正在查看的代码已从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值.

(从我对这个问题的回答中复制的代码示例.)

  • 这是我的假设,但显然这些变量的大部分用途实际上并不适用于函数参数.看起来他们只是机械地替换了每个文字,可能是因为它比专门针对功能参数更容易.此外,[Fortran论证关联并未完全通过引用](https://software.intel.com/en-us/blogs/2009/03/31/doctor-fortran-in-ive-come-here-for -an-参数); 有一些奇怪的特殊情况. (2认同)

R S*_*ahu 5

用于

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++.

如果翻译是由程序完成的,那么为什么变量的命名方式是可以理解的.

如果翻译是由人工完成的,他们可能会遵循一些关于如何快速移动事物的指导原则,而不一定通过理解代码来创建有意义的变量名称.

  • 这些应该仍然是常量. (5认同)
  • `one`是100%愚蠢,毫无疑问.但公平地说,像`p1`和`p5`这样的名字如果从正在实施的科学论文中引用变量*p1*或*p5*之类的东西就有意义.当然,如果它们代表"[零]点1"和"[零]点5",它们就像"一"一样愚蠢. (5认同)
  • 比const更有用:`constexpr` (2认同)
  • 哎呀,@ marshal (2认同)

Uni*_*ant 5

我见过这种情况的一个案例是使用哈佛架构的一些(较旧的,嵌入式)平台.

假设我有一个(外部库)函数,它将一个指针作为参数:

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一次的值),而不是每次需要它时使它成为一个自动变量.

我承认一个利基用例.


Lig*_*ica 3

不,这个常数很愚蠢。如果没有其他原因,它实际上不是一个常数。

  • 您还需要什么解释?看,这就是为什么这里不允许基于意见的帖子的原因。我真的不应该回答! (2认同)