9

In C we can write:

#define LOWER 0

And in Java we can write:

static int lower = 0;

Don't these statements have the same purpose of letting other methods use the variable lower?

4

8 回答 8

4

他们完全不同。定义更像是 C 预处理器使用的复制粘贴。Static 是 Java 类的属性修饰符。静态属性可以在运行时更改。

于 2013-10-02T21:10:02.407 回答
1

#define在 C 中导致文本替换。例如:

#define PI 3.14

...
a = PI * r * r;  // becomes: a = 3.14 * r * r

现在,范围#define远不止于此;它不仅限于变量(Java 中没有直接等价的东西)。当您有一个static变量时,无法保证该变量不会改变,因此无法制作类似的“文本变电站”。但是,当您声明一个static final变量并将其分配给编译时常量时就有了这样的保证。所以:

public static final double PI = 3.14;

...
a = PI * r * r;  // becomes: a = 3.14 * r * r, like in C

就像发生了什么一样#define,静态最终常量在编译时被它们的实际值替换。从这个意义上说,静态最终常量类似于#define常量。

于 2013-10-02T21:21:26.540 回答
0

定义预处理器非常适合命名常量,但它不提供 Java(或 C++)常量声明所允许的相同类型检查。作为 C 和 C++ 开发人员多年,我非常喜欢 C++(和 Java)提供的类型检查。让人联想到合同设计等。

但是 Perl、Python 和 Ruby 等提供“鸭子类型”的语言的灵活性以及对类型声明的不那么严格的方法也具有优点。严格的类型检查提供的哲学学科有其优点。但是当你只是试图声明一个(命名的)const(ant) 时,所有的严格性似乎都被夸大了。

所以,是的,#define 是拼写“常量”的一种方式。

#define PIE (3.142) //C preprocessor
float PIE_() { return 3.142; } //C also
const float PIE = 3.142; //C++ const
public static final float PIE = 3.142; //Java
PIE = 3.142 #Ruby makes variables with initial capital constant
PIE = 3.142 #Python doesn't really have constants
#Perl is harder, you really have a hard time defining constants
sub PIE { 3.142; }

但是请阅读有关在 Python 中创建变量常量的难度。 http://code.activestate.com/recipes/65207-constants-in-python/?in=user-97991

于 2013-10-03T06:45:40.960 回答
0

Java 定义的最大优点final int LOWER=0;是 LOWER 始终是一个变量,并且对调试器是可见的。

在 C 中,定义的值被代码中的预编译器替换,并且常量名消失了。

于 2013-10-02T21:21:56.103 回答
0

从 C 到 C++ 的第一个建议是:“不要使用 #define”,尝试使用常量变量。'#define' 很难调试。

于 2013-10-02T21:22:34.530 回答
0

#define是一个预处理器指令 - 您定义的值在编译之前被交换到代码中提到的任何地方。但是它有许多陷阱——就像任何全局变量一样,它可能与其他地方(除其他外)类似命名的变量发生冲突。

如果您想要一个常量,请const改用。

于 2013-10-02T21:15:30.540 回答
0

静态的,没有。

最终,是的。

final int LOWER = 0;

一个final变量只能初始化一次。

static变量属于类,而不是实例。

然而

它们在功能上可能相似,但操作方式完全不同。

final 变量仍然是一个变量。C(++) 中的A#define实际上在构建时被解释,并相应地修改二进制输出,导致 vales 在运行时成为常量。

#define效率更高。

于 2013-10-02T21:07:26.593 回答
0

#define lower 0较低的不是一个变量。在编译时,lower将被替换0为在整个代码中使用的位置。

static int lower = 0;定义一个变量和实际的内存引用将在运行时完成以访问变量的值。加值可以在您的代码中更改。

为避免更改,您可以像这样定义它static final int lower = 0;

现在的编译器在优化方面做得非常好。所以在编译时只有这lower将被替换为0.

所以你只能“说”#define lower 0在C中相当于static final int lower = 0;但它们不一样。因为后者在优化阶段被替换了。如果优化关闭,它不会在编译时被替换。

我希望这有帮助。

于 2013-10-02T21:40:19.557 回答