Diferencia entre “3” y “3” en C

Intenté ejecutar el siguiente progtwig en C y obtuve algunos resultados. ¿Me pueden ayudar por qué?

#include int main() { char x='A'; printf("%d%d%d",sizeof("3"),sizeof('3'),sizeof(3)); return 0; } 

La salida recibida es 2 4 4 usando gcc en ubuntu 11.04 32 bit.

Del mismo modo en otro progtwig: –

 #include int main() { char x='A'; printf("%d%d",sizeof('A'),sizeof(x)); return 0; } 

La salida recibida es 4 1 usando GCC en ubuntu 11.04 32 bit.

¿Me pueden ayudar por qué la salida es así?

En C, los literales de caracteres son de tipo entero, por lo que sizeof('3') == sizeof(int) . Ver esta C Preguntas frecuentes para más detalles.

Esta es una de las áreas donde C y C ++ difieren (en C ++ sizeof('3') es 1 ).

En realidad, corrigiendo mi afirmación anterior, sizeof("3") producirá 2 porque “3” se trata como una matriz de caracteres de 2 elementos.

6.3.2.1/3

Excepto cuando es el operando del operador sizeof o el operador unario &, o si se utiliza un literal de cadena para inicializar una matriz, una expresión que tiene el tipo “matriz de tipo” se convierte en una expresión con el puntero de tipo a ” escriba “” que apunta al elemento inicial del objeto de matriz y no es un valor l.

Cía

3 : literal entero, escriba int
'3' : char literal, escribe int
"3" : cadena literal: escriba char[2]

En su segundo ejemplo, x denota un objeto de tipo char .

El ‘3’ se convierte al tipo int, que es de 4 bytes. Sin embargo, “3” es una cadena con dos bytes. El primer byte es el char 3 y el segundo es el terminador nulo que se agrega a todas las cadenas.

“C” es

 char mystring[2]; mystring[0] = 'C'; mystring[1] = '\0'; 

Mientras que ‘c’ es

 int mychar; mychar = 'C'; 

'3' es una constante de carácter. En C, las constantes de caracteres tienen tipo int (en C ++, tienen tipo char ). Por lo tanto, sizeof '3' == sizeof (int) .

"3" es una cadena literal. Es una matriz de 2 elementos de char ( const char en C ++) con los valores {'3', '\0'} . sizeof (char) == 1 por definición, por lo tanto, sizeof "3" == 2.

3 es una constante entera. Tiene tipo int . Por lo tanto, sizeof 3 == sizeof (int) .

La variable x se declara como char , por lo tanto sizeof x == 1.