Posso definire la lunghezza di un array usando una costante, quindi perché int d [b] non funziona?


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

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

La definizione di f[c]è valida.
Anche la variabile bè una costante int, ma il compilatore mi ha dato l'errore "espressione deve avere un valore costante" per la riga int d[b]. Quali sono le differenze tra be c?

Risposte:


16

quali sono le differenze tra bec?

c ha un inizializzatore di costanti di tempo di compilazione, mentre b no. Un oggetto const con inizializzatore di costante di tempo di compilazione è esso stesso un valore di costante di tempo di compilazione.

Dato che posso definire un decimo di un arry usando una costante, quindi perché non funziona?

Non farà qualsiasi costante. constil qualificatore implica la costanza di runtime (ovvero il valore può essere determinato in fase di runtime ma non cambierà per tutta la durata dell'oggetto). Solo le dimensioni della costante di tempo di compilazione possono essere utilizzate come dimensioni dell'array.


6

Si sta utilizzando una variabile non costante per assegnare valore a una costante. Pertanto, il valore di quella variabile non può essere determinato in fase di compilazione . So che non stai cambiando a, ma il compilatore non la pensa così.


4

La diagnostica del compilatore dovrebbe essere un'espressione costante valutabile in fase di compilazione .

Poiché l'oggetto originale a cui bè assegnato non lo è const, non bè un'espressione costante valutabile in fase di compilazione, quindi la compilazione avrà esito negativo poiché le matrici a lunghezza variabile non sono supportate in C ++ standard.


1

"Const" significa solo che la variabile non cambierà in fase di esecuzione e non significa che il suo valore possa essere dedotto in fase di compilazione.

Immagino che quello che stai cercando sia "constexpr". Forse puoi provarlo in questo modo:

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

"Constexpr" significa invece "const reale" e "const" significa solo "var non mutevole", a causa di una ragione storica. Va tenuto presente che un array nativo in c ++ ha sempre una lunghezza fissa, come diceva @Bathsheba.


Di quali "altre lingue" stai parlando?
Brian

1
@Brian Siamo spiacenti, non è rilevante. Ho cambiato la mia risposta.
Leon,

"No true scotsman ..." - lasciami in disaccordo con il tuo "constexpr" invece significa "const reale" e "const" significa solo "var var non modificabile" . "const" significa "const", "constexpr" significa "constexpr" - hanno due significati e implicazioni distinti nel contesto del linguaggio c ++. "const" significa "L'oggetto non può essere modificato" , "constexpr" significa "è possibile valutare il valore della funzione o della variabile al momento della compilazione"
CharonX

Scusa, forse l'ho espresso in modo errato. L'inglese non è la mia lingua madre.
Leon,

1

Il termine "costante" è davvero ambiguo e la parola chiave constè fuorviante.

constsignifica: "non consentire che il valore di questo oggetto non venga modificato dopo l'inizializzazione". Essa non significa "costante fase di compilazione". Il suo valore iniziale può (e di solito lo fa) provenire ancora da fonti di runtime.

È necessaria una costante di compilazione per un limite di array.

A volte è possibile avere un oggetto chiamato fooche è costante di compilazione, se lo è const ed è stato inizializzato da un'espressione costante, come un letterale o una constexprcosa. Questo è il caso di c; non è il caso di b.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.