Come determinare il risultato dell’assegnazione della costante di carattere multi-carattere a una variabile char?

Perché una variabile char ottiene “b” dall’assegnazione di “ab”, piuttosto “a”?

char c = 'ab'; printf("c: %c\n", c); 

stampe:

 c: b 

Questa è l’implementazione definita come le risposte precedenti già dicono.

Il mio gcc gestisce ‘ab’ come int. Il seguente codice:

 printf( "sizeof('ab') = %zu \n", sizeof('ab') ); printf( "'ab' = 0x%08x \n", 'ab' ); printf( "'abc' = 0x%08x \n", 'abc' ); 

stampe:

 sizeof('ab') = 4 'ab' = 0x00006162 'abc' = 0x00616263 

Nel tuo codice, la linea:

 char c = 'ab'; 

Può essere considerato come:

 char c = (char)(0x00006162 & 0xFF); 

Quindi c ottiene il valore dell’ultimo carattere di “ab”. In questo caso è ‘b’ (0x62).

Secondo lo standard, è definito l’implementazione. Da 6.4.4.4 Costanti di caratteri :

Una costante di carattere intero ha tipo int. Il valore di una costante di carattere intero contenente un singolo carattere mappato a un carattere di esecuzione a byte singolo è il valore numerico della rappresentazione del carattere mappato interpretato come un numero intero. Il valore di una costante di carattere intero contenente più di un carattere (ad es. ‘Ab’) o contenente un carattere o una sequenza di escape che non viene mappata su un carattere di esecuzione a byte singolo, è definito dall’implementazione.

Il valore di una costante multi-carattere intera è definito dall’implementazione, secondo lo standard C11 ( §6.4.4.4 “Costanti di caratteri” al10 p69 ):

10 – […] Il valore di una costante di carattere intero contenente più di un carattere (ad es. ‘Ab’) o contenente un carattere o una sequenza di escape che non viene mappata su un carattere di esecuzione a byte singolo, è definito dall’implementazione . […]

Perché 'ab' ha tipo int e un char può contenere solo un byte.

Modifica successiva: la mia risposta è stata complementare a quelle precedenti, che indicavano chiaramente che si tratta di un comportamento specifico dell’implementazione. Avevo l’impressione che l’OP volesse sapere, con questo in mente, perché il compilatore ha scelto “b” su “a”. Scusa se la mia risposta è stata confusa.

Endianess. Ecco perché ottieni “b” anziché “a”. Per come è rappresentato nella memoria della tua macchina. E la tua macchina è probabilmente little endian.

Provalo su uno sparc o su un mipsbe o su un arm e potresti ottenere ‘a’ invece di ‘b’.

In ogni caso, spero che non dipendiate da questo per il codice di produzione attuale.