ist in C ähnlich wie eine statische Variable in Java definiert?

8

In C können wir schreiben:

%Vor%

Und in Java können wir schreiben:

%Vor%

Haben diese Anweisungen nicht denselben Zweck, andere Methoden die Variable low verwenden zu lassen?

    
Rohan 02.10.2013, 21:05
quelle

8 Antworten

4

Sie sind total verschieden. Definiere ist mehr eine Kopie einfügen, die der C-Präprozessor verwendet. Static ist ein Attributmodifikator für eine Java-Klasse. Ein statisches Attribut kann zur Laufzeit geändert werden.

    
aglassman 02.10.2013 21:10
quelle
1

#define in C bewirkt eine Textersetzung. Zum Beispiel:

%Vor%

Nun ist der Umfang von #define viel größer als das; es ist nicht nur auf Variablen beschränkt (und es gibt in Java nicht direkt etwas Ähnliches). Wenn Sie eine static -Variable haben, gibt es keine Garantie, dass sich diese Variable nicht ändert, sodass eine ähnliche "textuelle Unterstation" nicht erstellt werden kann. Allerdings , wenn Sie eine Variable static final deklarieren und sie einem Kompilierzeitkonstante , da ist eine solche Garantie. Also:

%Vor%

Ähnlich wie bei #define werden statische Endkonstanten zur Kompilierzeit durch ihre tatsächlichen Werte ersetzt. In diesem Sinne sind statische Endkonstanten ähnlich wie #define Konstanten.

    
arshajii 02.10.2013 21:21
quelle
0

statisch , nein.

final , ja.

%Vor%

Eine final Variable kann nur einmal initialisiert werden.

static Variablen gehören zur Klasse und nicht zu einer Instanz.

JEDOCH

Sie können in der Funktion ähnlich sein, aber die Art und Weise, wie das funktioniert, ist völlig anders.

Eine letzte Variable ist immer noch nur eine Variable. A #define in C (++), wird tatsächlich bei Build interpretiert und modifiziert die Binärausgabe entsprechend, was bewirkt, dass die Variablen zur Laufzeit Konstanten sind.

#define ist effizienter.

    
Matt Clark 02.10.2013 21:07
quelle
0

#define ist eine Präprozessordirektive - der Wert, den Sie definieren, wird vor der Kompilierung an die Stelle im Code getauscht, an der er angegeben wurde. Es gibt eine Reihe von Fallstricken - Wie jede globale Variable kann es unter anderem mit einer ähnlich benannten Variablen in Konflikt kommen.

Wenn Sie eine Konstante wünschen, verwenden Sie stattdessen const .

    
Gigi 02.10.2013 21:15
quelle
0

Der erste Ratschlag von C nach C ++ lautet: "Verwenden Sie nicht #define", versuchen Sie stattdessen, eine konstante Variable zu verwenden. '#define' ist schwer zu debuggen.

    
Elliot Chen 02.10.2013 21:22
quelle
0

Der große Vorteil der Java final int LOWER=0; -Definition ist, dass LOWER immer eine Variable bleibt und für den Debugger als solche sichtbar ist.

In C wird der definierte Wert durch den Precompiler im Code ersetzt und der Konstantenname ist weg.

    
Costis Aivalis 02.10.2013 21:21
quelle
0

in #define lower 0 low ist keine Variable. Zur Kompilierzeit wird lower durch 0 ersetzt, wo immer es in einem ganzen Code verwendet wird.

wobei static int lower = 0; eine Variable definiert und die tatsächliche Speicherreferenz zur Laufzeit ausgeführt wird, um auf den Wert einer Variablen zuzugreifen. Plus-Wert davon kann in Ihrem Code geändert werden.

Um Änderungen zu vermeiden, können Sie es wie folgt definieren static final int lower = 0;

Compiler machen jetzt einige Tage ziemlich gute Arbeit in der Optimierung. Zur Kompilierzeit wird nur dieser lower durch 0 ersetzt.

Sie können also nur "sagen", dass #define lower 0 in C äquivalent zu static final int lower = 0; ist. Aber sie sind nicht gleich. Weil der spätere während der Optimierungsphase ersetzt wurde. Wenn die Optimierung deaktiviert ist, wird sie bei der Kompilierung nicht ersetzt.

Ich hoffe, das hilft.

    
Dhaval 02.10.2013 21:40
quelle
0

Der Define Preprocessor eignet sich hervorragend zum Benennen von Konstanten, bietet aber nicht den gleichen Typ, der eine Java (oder C ++) Konstanten-Deklaration erlaubt. Da ich viele Jahre C- und C ++ - Entwickler war, mag ich die Typüberprüfung, die C ++ (und Java) bietet. Erinnert an Design nach Vertrag usw.

Aber auch die Flexibilität von Sprachen wie Perl, Python und Ruby, die "Duck-Typisierung" bieten, und ein weniger rigoroser Ansatz für Typdeklarationen sind ebenfalls von Vorteil. Die philosophische Disziplin, die eine strenge Typprüfung bietet, hat ihren Wert. Aber wenn Sie nur versuchen, eine (benannte) const (ant) zu deklarieren, scheint die ganze Strenge übertrieben zu sein.

Also, ja, ein #define ist eine Möglichkeit, um 'konstant' zu buchstabieren.

%Vor%

Aber lesen Sie, wie schwer es wirklich ist, eine Variable in Python konstant zu machen. Ссылка

    
ChuckCottrill 03.10.2013 06:45
quelle

Tags und Links