2013-04-08 27 views
7

Non ho accesso alle specifiche C11, quindi non posso indagare su questo errore.Inizializzazione array con un operatore ternario?

La seguente dichiarazione sorge un errore durante la compilazione:

int why[2] = 1 == 1 ? {1,2} : {3,4}; 

L'errore è: espressione prevista prima {e: Espressione prevista prima:

+2

Hai provato questo: int perché [2] = (1 == 1)? {1,2}: {3,4}; – luckystars

+3

sì: questo non fa differenza –

+0

Non esiste nella sintassi dell'inizializzazione dell'array. – BLUEPIXY

risposta

9

Questo non è valida C11.

È possibile inizializzare solo una matrice con un elenco inizializzatore non con un'espressione.

int why[2] = { ... }; // initializer-list {} 

Inoltre, 1 == 1 ? {1,2} : {3,4} non è un'espressione C valida perché {1, 2} non è un'espressione C.

Solo per informazioni utilizzando letterali composti si può avere qualcosa di simile a ciò che si desidera utilizzando un oggetto puntatore:

int *why = (1 == 1) ? (int[2]) {1,2} : (int[2]) {3,4}; 
+0

funziona: 'int works = 1 == 1? 42: 6 * 7; ' –

+1

@ RudiRüssel sì, quello è valido ma non esiste un'espressione' {1, 2} 'e' works' non è un array. – ouah

+1

@ RudiRüssel: le espressioni sono cose con valori. '6 * 7' ha un valore. Gli elenchi di inizializzatori non sono espressioni; sono solo una sintassi per descrivere più valori da inserire nell'oggetto quando viene inizializzato. Il codice sorgente '{1, 2}' non è un valore o un oggetto o qualcosa che puoi manipolare. È solo una descrizione di cosa mettere in un array. Perché non è un'espressione, non puoi operare su di essa; non puoi usarlo come un operando per '? : 'o per altri operatori. –

2

dalla risposta di Charles Bailey qui: Gramma from conditional-expression

conditional-expression: 
     logical-OR-expression 
     logical-OR-expression ? expression : conditional-expression 

E

1 == 1 ? {1,2} : {3,4}; 
     ^ ^  are not expressions 

questo è il motivo per cui il compilatore restituisce un errore del tipo:

error: expected expression before ‘{’ token // means after ? 
error: expected expression before ‘:’ token // before : 

Modifica come @Rudi Rüssel commentato:

seguente è un codice valido in c:

int main(){ 
    {} 
    ; 
    {1,2;} 
} 

usiamo {} combinare dichiarazioni ; in C.

nota: se scrivo {1,2} quindi errore s (*expected ‘;’ before ‘}’ token*), perché 1,2 è un'espressione ma non una dichiarazione.

Per OP: ciò che è e ciò che è The Expression Statement in CBlock Statement e Expression Statements

EDIT2:
Nota: Come @ouah Typecase usa per convertirlo in espressione, sì:

per capire eseguire questo codice:

int main(){ 
printf("\n Frist = %d, Second = %d\n",((int[2]){1,2})[0],((int[2]) {1,2})[1]); 
} 

funziona così:

~$ ./a.out 

Frist = 1, Second = 2 
+0

Per quanto ne so: cosa significa '{1,2}' se non un'espressione? –

+0

@ RudiRüssel il suo blocco '{}' per combinare le istruzioni –

+1

@ RudiRüssel: '{1, 2}' è un inizializzatore. Questo è descritto nella clausola 6.7 dello standard C 2011. Le espressioni sono descritte in una clausola diversa, 6.5. –

0

Gli elenchi di inizializzatori non sono espressioni, quindi non possono essere utilizzati nelle espressioni.

Suggerisco di lasciare la matrice non inizializzata e utilizzare memcpy.

int why[2]; 
memcpy(why, 1 == 1 ? (int[2]){1,2} : (int[2]){3,4}, sizeof why);