C中的#define类似于Java中的静态变量吗?

C中的#define类似于Java中的静态变量吗?,java,c,variables,static,Java,C,Variables,Static,我们可以用C写: #define LOWER 0 在Java中,我们可以编写: static int lower = 0; 这些语句的目的不是让其他方法使用较低的变量吗?static,否 决赛,是的 final int LOWER = 0; final变量只能初始化一次 static变量属于类,而不是实例 然而 它们的功能可能相似,但操作方式完全不同 最后一个变量仍然只是一个变量。C(++)中的#define实际上是在构建时解释的,并相应地修改二进制输出,使值在运行时成为常量 #defin

我们可以用C写:

#define LOWER 0
在Java中,我们可以编写:

static int lower = 0;

这些语句的目的不是让其他方法使用较低的变量吗?

static,否

决赛,是的

final int LOWER = 0;
final
变量只能初始化一次

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

然而

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

最后一个变量仍然只是一个变量。C(++)中的
#define
实际上是在构建时解释的,并相应地修改二进制输出,使值在运行时成为常量


#define
更有效。

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

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

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

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

#define PI 3.14

...
a = PI * r * r;  // becomes: a = 3.14 * r * r
现在,
#define
的范围要大得多;它不仅限于变量(Java中也没有直接等价的东西)。当您有一个
静态
变量时,无法保证该变量不会更改,因此无法创建类似的“文本子站”。但是,当您声明一个
静态final
变量并将其分配给时,就有这样的保证。因此:

public static final double PI = 3.14;

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

#define
类似,静态最终常量在编译时被实际值替换。从这个意义上讲,静态final常量类似于
#define
常量。

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


在C中,定义值被代码中的预编译器取代,常数名已经消失。

< P>第一个从C到C++的建议是:“不要使用“y-定义”,而是尝试使用常量变量。”“定义”很难调试

中定义下限0
下限不是变量。在编译时,
lower
将被整个代码中使用的
0
替换

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

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

编译器现在在优化方面做得相当好。因此在编译时,只有这个
lower
将被
0
替换

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


我希望这会有所帮助。

define预处理器非常适合命名常量,但它不提供Java(或C++)常量声明所允许的类型检查。多年来,我一直是C和C++开发人员,我非常喜欢C++和java提供的类型检查。让人想起合同设计等

但Perl、Python和Ruby等语言的灵活性也有其优点,它们提供了“duck类型”和不太严格的类型声明方法。严格的类型检查所提供的哲学学科是有价值的。但是,当您只是试图声明一个(命名的)常量(ant)时,所有的严格性似乎都被夸大了

所以,是的,定义是拼写“常量”的一种方法

#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中使变量变为常量是多么困难。

我通常在一个单独的常量类中看到static和final<代码>类常量{public static final int Lower=0;}
如何判断define更有效?在C++中,不应该像变量一样去寻找<代码> const < /> >重要的是要注意,在使用<代码>静态最终< /C> >(使用编译时常数)时,会有类似的复制粘贴。静态最终属性可以在静态块中分配,在类装入器装入类时执行静态块。对于这个简单的例子,它的功能是相同的。最好说明为什么文本替换并不总是产生预期的结果。例如,
#定义页面宽度8.5
#定义打印宽度页面宽度-3
双中心=打印宽度/2
中心定义为
8.5-3/2
,即
7.5
。不幸的是,有许多地方(例如数组维度)可以使用编译时常量表达式,但
常量
声明的全局表达式不能使用。唯一在语义上表现为常量的C结构是常量文本表达式或
enum
值,后者仅限于可表示为
int
的内容。