Ich kann die Länge eines Arrays mithilfe einer Konstante definieren. Warum funktioniert int d [b] nicht?

11
int a = 5;
const int b = a, c = 4;

int e[a];
int d[b];
int f[c];

Die Definition von f[c]ist gültig.
Die Variable bist ebenfalls eine Konstante int, aber der Compiler gab mir den Fehler "Ausdruck muss einen konstanten Wert haben" für die Zeile int d[b]. Was sind die Unterschiede zwischen bund c?

OliverShang
quelle

Antworten:

16

Was sind die Unterschiede zwischen b und c?

c hat einen Initialisierer für die Kompilierungszeitkonstante, b nicht. Ein const-Objekt mit dem Initialisierer der Kompilierungszeitkonstante ist selbst ein Wert für die Kompilierungszeitkonstante.

Da ich ein Lenth einer Arry mit einer Konstanten definieren kann, warum funktioniert das nicht?

Nicht irgendeine Konstante reicht aus. constQualifizierer impliziert Laufzeitkonstanz (dh der Wert kann zur Laufzeit bestimmt werden, ändert sich jedoch nicht während der Lebensdauer des Objekts). Nur Werte für die Kompilierungszeitkonstante können als Arraygröße verwendet werden.

Eerorika
quelle
6

Sie verwenden eine nicht konstante Variable, um einer Konstanten einen Wert zuzuweisen. Daher kann der Kompilierungszeitpunkt dieser Variablen nicht bestimmt werden . Ich weiß, dass Sie sich nicht ändern a, aber der Compiler denkt nicht so.

CoderCharmander
quelle
4

Die Compiler-Diagnose sollte wirklich ein aus der Kompilierungszeit auswertbarer konstanter Ausdruck sein .

Da das ursprüngliche Objekt, dem bzugewiesen wurde const, bkein auswertbarer konstanter Ausdruck zur Kompilierungszeit ist, schlägt die Kompilierung fehl, da Arrays mit variabler Länge in Standard-C ++ nicht unterstützt werden.

Bathseba
quelle
1

Die "const" bedeutet nur, dass sich die Variable zur Laufzeit nicht ändert, und bedeutet nicht, dass ihr Wert zur Kompilierungszeit abgeleitet werden kann.

Ich denke, was Sie suchen, ist "constexpr". Vielleicht können Sie es so ausprobieren:

constexpr int b = 4; // can't be assigned from a!
int d[b];

Das "constexpr" bedeutet stattdessen eine "echte Konstante" und die "Konstante" bedeutet aus irgendeinem historischen Grund nur "nicht ändernde Var". Es muss beachtet werden, dass ein natives Array in c ++ immer eine feste Länge hat, wie @Bathsheba sagte.

Leon
quelle
Über welche "anderen Sprachen" sprichst du?
Brian
1
@ Brian Sorry, es ist nicht relevant. Ich habe meine Antwort geändert.
Leon
"Kein wahrer Schotte ..." - lassen Sie mich nicht zustimmen, dass "constexpr" stattdessen eine "echte Konstante" bedeutet und "Konstante" nur "nicht ändernde var" -Anweisung bedeutet . "const" bedeutet "const", "constexpr" bedeutet "constexpr" - sie haben zwei unterschiedliche Bedeutungen und Implikationen im Kontext der c ++ - Sprache. "const" bedeutet "Objekt kann nicht geändert werden" , "constexpr" bedeutet "es ist möglich, den Wert der Funktion oder Variablen zur Kompilierungszeit
auszuwerten
Entschuldigung, vielleicht habe ich es falsch ausgedrückt. Englisch ist nicht meine Muttersprache.
Leon
1

Der Begriff "Konstante" ist wirklich mehrdeutig und das Schlüsselwort constist irreführend.

constbedeutet: "Nicht zulassen, dass der Wert dieses Objekts nach der Initialisierung nicht geändert wird". Dies bedeutet nicht "Kompilierungszeitkonstante". Sein Anfangswert kann (und wird normalerweise) immer noch aus Laufzeitquellen stammen.

Sie benötigen eine Konstante zur Kompilierungszeit für ein gebundenes Array.

Es ist manchmal möglich, ein Objekt mit dem Namen fooCompile-Time-Konstante zu haben, wenn es const und ist es aus einem konstanten Ausdruck wie einem Literal oder einem initialisiert wurde constexpr. Das ist der Fall für c; es ist nicht der Fall für b.

Leichtigkeitsrennen im Orbit
quelle