2013-04-26 7 views
5

Un collaboratore di grande reputazione "R.." su questo forum mi ha detto in modo esplicito questo 2 giorni indietro:È "const int x = get();" legale in C? Possiamo assegnare il valore di ritorno di una funzione a una costante alla dichiarazione?

Initializers for objects of static storage duration must be constant expressions. The result of a function call is not a constant expression.

Stava parlando variables.But globale Non sono sicuro di ciò che accade con costanti dichiarate all'interno della funzione main(), o qualsiasi funzione in questo senso. Anche se intuitivamente sento che è così anche per le costanti dichiarate all'interno delle funzioni, il seguente programma estratto dal seguente link, con la sua presunta risposta correct, mi confonde.

http://www.indiabix.com/c-programming/const/discussion-546

#include<stdio.h> 
int get(); 

int main() 
{ 
    const int x = get(); 
    printf("%d", x); 
    return 0; 
} 

int get() 
{ 
    return 20; 
} 

Così qualcuno può spiegare se è valido C per assegnare un valore di ritorno ad una costante?

+0

... e IIRC, ti ho detto due giorni fa che non c'è alcuna cosa come variabili globali * * a C, e che si sta facendo riferimento a variabili dichiarate nell'ambito di file che hanno la durata di archiviazione statica. C'è una differenza piuttosto grande. Le variabili dichiarate nell'ambito del file hanno una visibilità molto minore; Sono * solo * visibili nella loro unità di traduzione, * dopo * la loro dichiarazione. Le variabili globali sono anche visibili al di fuori della loro unità di traduzione e prima della loro dichiarazione. – Sebivor

+0

@undefinedbehaviour In quale contesto hai postato questo commento? Sei 'R..' usando un altro ID? Chi è IIRC? A proposito, non ci sono davvero variabili globali in C? Le variabili non sono dichiarate al di fuori di tutte le variabili globali delle funzioni? –

+0

Nel contesto di "variabili globali in C", che non esistono per le ragioni che ho indicato sopra, ho detto che non esistono. Io non sono R .. IIRC sta per "Se ricordo correttamente". Puoi cercare "globale" nello standard C, se lo desideri, e non troverai nulla di rilevante. Come ho detto in precedenza, le variabili dichiarate al di fuori di tutte le funzioni sono dichiarate * nell'ambito del file *, con * durata di archiviazione statica * e sono visibili * solo dal punto di dichiarazione fino alla fine dell'unità di traduzione *. Questo è diverso dalla definizione di * variabile globale * in altre lingue. – Sebivor

risposta

7

Sì, è perfettamente valido, poiché la variabile è automatica, ad esempio nonstatic.

Le restrizioni si applicano alle variabili static, i cui valori devono essere noti al momento della compilazione.

Si noti che C distingue tra "espressioni costanti" e altre espressioni e che il valore di inizializzatore utilizzato per le variabili static deve essere un'espressione così costante. Per le variabili non static, non esiste tale requisito.

+1

Sarà molto utile se è possibile condividere ulteriori fatti circa this.Please elaborare un po 'meno che questa domanda è un duplicate.I sono sicuro che molti altri neofiti piacerebbe saperne di più. –

+2

In una lingua con tanta comportamento non definito e l'attuazione definiti come C, "solo provare" quasi mai è una risposta utile per una questione di "è legale?". – Cairnarvon

+0

@Cairnarvon Grande, come se io non ero confuso già, ora vedo qualcuno con 123k reputazione di essere downvoted.'Cairnarvon' si prega di post-it in una risposta, sono sicuro che molti altri come me, ne trarranno vantaggio. –

3

Sì, questo compito è valido C. Ma x non è un'espressione costante, è una variabile const-qualificata, che non è la stessa cosa (in C almeno).

C11 (n1570), § 6.6 espressioni costanti

Un numero intero espressione costante deve avere tipo intero e avrà solo operandi che sono costanti intere, le costanti di enumerazione, le costanti carattere, sizeof espressioni cui i risultati sono costanti intere, espressioni _Alignof e costanti costanti che rappresentano gli operandi immediati dei calchi.

costanti intere sembrano 42, 0L o 89.0. Ad esempio, nel seguente snippet di codice, 2 è una costante intera, ma non lo è x.

const int x = 2; 
+0

Sarà molto utile se si elabora un po 'sulla differenza tra variabili qualificate cost e espressioni costanti in questo contesto. Grazie –

+0

Anche se devo ammettere il tuo 'avatar-foto 'Mi ha distratto per un po '. Non vediamo molto su questo forum, e molto poco accanto a così alta reputazione –

+0

Chi ha downvoted questa risposta e perché? Si prega di spiegare il motivo –

1

Quello che penso ti rende confuso è che si stia mescolando il qualificatore di tipoconst, con la classe di archiviazione specificatorestatic. Queste sono caratteristiche completamente diverse, non è possibile confrontarle l'una con l'altra.

const significa che una variabile è di sola lettura nell'ambito dell'ambito in cui è stata dichiarata e può essere assegnato un valore solo quando è inizializzato. Ovvero, sulla stessa riga in cui è stata definita la variabile const. Significa nient'altro.

La durata dell'archiviazione statica indica che una variabile sarà presente durante l'intera esecuzione di un programma. Tutte le variabili dichiarate come static e tutte le variabili dichiarate nell'ambito del file ("globals") hanno una durata di archiviazione statica. Come accennato, le variabili con durata di memorizzazione statica possono essere inizializzate solo con un'espressione , che non deve essere confusa con le variabili di sola lettura dichiarate come const.

Quindi qualcuno può spiegare se è valido in C assegnare un valore di ritorno a una costante?

Dipende.

  • Qualsiasi variabile dichiarata nell'ambito del file ha una durata di archiviazione statica.
  • Una variabile con durata di archiviazione statica deve essere inizializzata con un'espressione costante.
  • Un valore di ritorno da una funzione non è un'espressione costante.
  • Pertanto una variabile con durata di archiviazione statica non può essere inizializzata con un valore di ritorno da una funzione.

Come si può vedere, ciò non ha avuto nulla a che fare con la parola chiave const ma tutto ciò che riguarda dove è stata dichiarata la variabile. Se la variabile, const o non, fosse dichiarata all'interno di un ambito locale, sarebbe perfettamente corretto inizializzarla con qualsiasi valore, come illustrato nell'esempio di codice.