2010-01-31 42 views
240

¿Cuál es el tamaño del carácter en C y C++? Por lo que yo sé, el tamaño de char es de 1 byte tanto en C como en C++.Tamaño del carácter ('a') en C/C++

In C:

#include <stdio.h> 
int main() 
{ 
    printf("Size of char : %d\n",sizeof(char)); 
    return 0; 
} 

In C++:

#include <iostream> 
int main() 
{ 
    std::cout<<"Size of char : "<<sizeof(char)<<"\n"; 
    return 0; 
} 

Sin sorpresas, tanto de ellos da la salida: Size of char : 1

Ahora sabemos que los personajes son representados como 'a', 'b', 'c', '|', ... Así que acaba de modificar los códigos anteriores a éstos:

En C:

#include <stdio.h> 
int main() 
{ 
    char a = 'a'; 
    printf("Size of char : %d\n",sizeof(a)); 
    printf("Size of char : %d\n",sizeof('a')); 
    return 0; 
} 

Output:

Size of char : 1 
Size of char : 4 

En C++ :

#include <iostream> 
int main() 
{ 
    char a = 'a'; 
    std::cout<<"Size of char : "<<sizeof(a)<<"\n"; 
    std::cout<<"Size of char : "<<sizeof('a')<<"\n"; 
    return 0; 
} 

Output:

Size of char : 1 
Size of char : 1 

Por qué los sizeof('a') devuelve valores diferentes en C y C++?

+6

El ' "% |"' 'formato requiere un argumento int' (o algo que promueve a 'int'). 'sizeof' produce un resultado de tipo' size_t'. Puede convertir a 'int' utilizando un molde o, si su implementación lo admite, use' "% zu" '. –

Respuesta

274

En C, el tipo de un carácter constante como 'a' es en realidad un int, con un tamaño de 4 (o algún otro valor dependiente de la implementación). En C++, el tipo es char, con un tamaño de 1. Esta es una de las muchas pequeñas diferencias entre los dos idiomas.

+0

Bien, ¿puede especificar la referencia estándar? :) –

+0

Esto es más o menos una respuesta genérica dado el código anterior: P – rmn

+10

En el estándar C++ es la sección 2.13.2/1, en C 6.4.4.4, al menos en el documento que tengo. –

25

Como dijo Paul, es porque 'a' es un int en C pero un char en C++.

que cubren esa diferencia específica entre C y C++ en algo que escribió hace unos años, en: http://david.tribble.com/text/cdiffs.htm

+4

Simplemente curioso, pero ¿estás trabajando en actualizar ese documento (muy detallado) para incluir los nuevos cambios en C++ 11 y C11? –

+0

No por el momento. Mi interés en C y C++ ha disminuido mucho en los últimos cinco años más o menos. –

+2

Uh, utilicé tu trabajo para escribir [esto] (http://741mhz.com/c-vs-cxx/) y aquí estás en SO. ¡Un mundo tan pequeño! –

13

En C el tipo de caracteres literales son int y carbón en C++. Esto se requiere en C++ para sobrecargar la función de soporte. Vea este ejemplo:

void foo(char c) 
{ 
    puts("char"); 
} 
void foo(int i) 
{ 
    puts("int"); 
} 
int main() 
{ 
    foo('i'); 
    return 0; 
} 

Salida:

char 
2

En lenguaje C, carácter literal no es un tipo char. C considera el carácter literal como entero. Por lo tanto, no hay diferencia entre sizeof('a') y sizeof(1).

Así, el carácter literal sizeof es igual al número entero sizeof en C.

En lenguaje C++, carácter literal es tipo de char. El cppreference de ejemplo:

1) carácter estrecha carácter literal u ordinaria literal, por ejemplo, 'a' o '\n' o '\13'. Tal literal tiene el tipo char y el valor igual a la representación de c-char en el juego de caracteres de ejecución. Si c-char es no representable como un solo byte en el juego de caracteres de ejecución, el literal tiene el tipo int y el valor definido por la implementación.

Por lo tanto, en C++ el literal de caracteres es un tipo de char. entonces, el tamaño del carácter literal en C++ es de un byte.

Alos, en sus programas, ha utilizado el especificador de formato incorrecto para el operador sizeof.

C11 §7.21.6.1 (P9):

Si una especificación de conversión no es válida, el comportamiento es undefined.275) Si algún argumento no es del tipo correcto para la conversión correspondiente especificación, el comportamiento no está definido.

Por lo tanto, se debe utilizar %zu especificador de formato en lugar de %d, de lo contrario, es un comportamiento indefinido en C.

+0

'% zu' no es compatible con muchas plataformas, pero es mejor portabilidad, use' (int) sizeof (char) 'y formatee'% d' – chqrlie

+0

El valor de los literales de caracteres no es necesariamente el correspondiente código ASCII. Depende de los juegos de caracteres de origen y ejecución y de si el tipo 'char' está firmado o no de manera predeterminada. – chqrlie