Newsgroup: it.comp.lang.c
Titolo: Prodotto di costanti non è costante?

Come mai scrivere:
const int a = 2;
const int b = 3;
const int c = a*b;
Provoca da parte del compilatore la reazione "error: initializer element 
is not constant"? Il prodotto di costanti inizializzate non è anch'esso 
una costante?
Grazie


Ehm, no... in C si chiama costante ma non e' una vera costante
come in altri linguaggi.
Devi pensarla piu' come una "variabile read-only". In pratica non
puoi inizializzare una variabile con il valore di altre variabili,
anche se essendo "read-only" non potranno mai cambiare valore.
ciao
Giacomo

 Giacomo
Grazie e mille per aver svelato il mistero!!

Devi pensarla piu' come una "variabile read-only".
Questa cosa non l'ho mai capita. Esiste una spiegazione del perché le
costanti in C debbano avere questa valenza particolare? è solo una
questione "storica"?

maelström ha scritto:

Valenza? il read-only intendi?
Dipende da dove viene scritto il valore nell'eseguibile e quindi al
"dove fa riferimento la variabile".

"dove fa riferimento la variabile".
A prescindere da questo (che poi in realtà non è tanto dove viene
scritto il valore nell'eseguibile, ma dove viene piazzato in memoria a
run-time), il "const" ha un significato a livello di compilazione,
ancor prima che di esecuzione.
-- 
maelström
http://apennacorrente.blogspot.com

maelström ha scritto:

Una costante simbolica, in C, la definisci con un #define. Il const 
significa read-only. Ad esempio ha senso prendere l'indirizzo di un 
"const float" ma che senso avrebbe prendere l'indirizzo di M_PI?
In C++ le cose vanno diversamente...
E.

Il const significa read-only.
Forse non è chiaro quello che ho chiesto. Mi chiedo: perché in C la
parola chiave "const" non debba rappresentare la stessa cosa che in
C++? qual è la ragione (storica?) ?
-- 
maelström
http://apennacorrente.blogspot.com

 in C++? qual è la ragione (storica?) ?
Domanda sbagliata sul NG sbagliato! Devi chiedere perché in C++ non ha 
lo stesso significato su it.comp.lang.c++.  ;-)
Forse là qualcuno potrà dirti perché in C++ hanno cambiato il 
significato della parola chiave 'const'.
Ciao
Giovanni
-- 
   A computer is like an air conditioner,
   it stops working when you open Windows.
   Registered Linux user #337974  < 
http://giovanni.homelinux.net/
 >

significato della parola chiave 'const'.
Io ritengo che in C++ abbiano restituito alla parola chiave "const" un
significato più opportuno, quello che intuitivamente si attribuisce a
una parola chiave del genere, ovvero quello che, a mio parere,
*avrebbe dovuto* avere in C sin dalla sua introduzione. Quindi,
ribadisco riformulando la domanda: perché in C la chiave const non ha
lo stesso significato che intuitivamente le si attribuirebbe?
Perché ci si trova tutte le volte a dover specificare, come Giacomo
giustamente ha fatto, che in C la const non ha lo stesso significato
che in tutti gli altri linguaggi?
Qual è la ragione storica che ha comportato questo significato
particolare per la const in C?
E' più chiara così la mia domanda?
-- 
maelström
http://apennacorrente.blogspot.com

 particolare per la const in C? E' più chiara così la mia domanda?
Dato che da quanto ricordo il C è stato il primo linguaggio ad 
introdurre la keyword 'const' perché negli altri il significato è 
cambiato.  Non esistono ragioni storiche.  IMO i linguaggi all'inizio 
della loro vita non avevano una base comune e sono stati sviluppati 
dal loro ideatore proprio per differenziarsi dagli altri.
Ci possono essere molte ragioni per criticare un linguaggio ma non 
credo che fra queste rientri la scelta delle keywords, specialmente 
quando si desidera implementare una feature che non è presente negli 
altri.  Io per esempio non ho mai capito per quale ragione nel C si 
siano scelte le parentesi '{' e '}' per indicare l'inizio e la fine di 
un blocco quando tutti i linguaggi del tempo (dal PL/1 al pascal) 
usavano 'BEGIN' ed 'END'.
Come ho scritto la domanda giusta dovrebbe essere (anche se, dato che 
non conosco abbastanza a fondo il C++ non so darti una risposta):  per 
quale ragione nel C++ (che fa esplicitamente riferimento al C) si è 
cambiato il significato?


 tutti i linguaggi del tempo (dal PL/1 al pascal) usavano 'BEGIN' ed 'END'.
Sapevo, ammesso che sia vero, che per il linguaggio C si sia cercato
di ridurre al minimo il numero di caratteri da digitare per la scrittura 
del codice e siano stati utilizzati quelli "comodi" utilizzando il 
layout di tastiera USA, per esempio noi per scrivere le {} usavamo 
strane combinazioni che non servivano con il layout USA.
Ciao
Luca

 significato più opportuno,
Non capisco perché ritieni più opportuno il significato che "oggi" si dà 
al const. Visto che il C da subito prevedeva un preprocessore, i valori 
costanti "immediati", vengono definiti con #define, e quindi non c'era 
bisogno di creare una nuova parola chiave nel linguaggio. In effetti le 
costanti "immediate", hanno solo un (importante) significato semantico 
ma dal punto di vista del compilatore non hanno grandi implicazioni. 
Invece il C, che è un linguaggio molto vicino all'hardware, ha bisogno 
di una parola chiave per specificare variabili "readonly". Questo ha una 
implicazione su dove le variabili vengono collocate sull'hardware. Le 
variabili "readonly" non possono essere modificate quindi sono costanti. 
Mi sembra quindi del tutto naturale che si scelga la parola chiave 
"const"...
Che poi gli altri linguaggi si siano evoluti diversamente, questa è 
un'altra storia. Dovresti poi chiederti come fanno gli altri linguaggi a 
specificare una variabile da memorizzare nella ROM... Immagino che quasi 
nessun'altro linguaggio abbia questa possibilità. La soluzione adottata 
dal C++ è molto particolare, ma se la esamini in dettaglio vedi che le 
scelte adottate seguono proprio questa distinzione tra costanti 
"immediate" e variabili "readonly". In C++ un "const int" è una costante 
immediata, mentre un "const int []" è una variabile readonly. Queste due 
tipologie vengono trattate diversamente, e il motivo è quello riportato 
sopra.
E.
E.