¿Por qué el tamaño de un carácter sizeof('a') es diferente en C y C++? [duplicar]
#include <stdio.h>
int main(void)
{
printf("sizeof(char) = %zu\n", sizeof(char));
printf("sizeof('a') = %zu\n", sizeof('a'));
}
Ver https://godbolt.org/z/1eThqvMhx
Al ejecutar este código en C, imprime
sizeof(char) = 1
sizeof('a') = 4
Al ejecutar este código en C++, imprime
sizeof(char) = 1
sizeof('a') = 1
¿Por qué la salida difiere entre idiomas? ¿Cuál es el tamaño de un carácter en C y C++? Hasta donde yo sé, el tamaño char
es de 1 byte tanto en C como en C++.
En C, el tipo de constante de carácter like '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 lenguajes.
Como dijo Paul, es porque 'a'
está int
en C pero char
en C++.
Cubro esa diferencia específica entre C y C++ en algo que escribí hace unos años, en: http://david.tribble.com/text/cdiffs.htm
En C, el tipo de caracteres literales es int y char en C++. Esto es necesario en C++ para admitir la sobrecarga de funciones . Vea este ejemplo:
void foo(char c)
{
puts("char");
}
void foo(int i)
{
puts("int");
}
int main()
{
foo('i');
return 0;
}
Producción:
char
En lenguaje C , el carácter literal no es un char
tipo. C considera el carácter literal como un número entero. Entonces, no hay diferencia entre sizeof('a')
y sizeof(1)
.
Entonces, el tamaño del carácter literal es igual al tamaño del número entero en C.
En lenguaje C++ , el carácter literal es el tipo de char
. La preferencia dice:
1) literal de carácter restringido o literal de carácter ordinario, por ejemplo,
'a'
o'\n'
o'\13'
. Dicho literal tiene un tipochar
y un valor igual a la representación de c-char en el conjunto de caracteres de ejecución. Si c-char no se puede representar como un solo byte en el conjunto de caracteres de ejecución, el literal tiene tipo int y valor definido por la implementación.
Entonces, en C++ el carácter literal es un tipo de char
. entonces, el tamaño del carácter literal en C++ es de un byte.
Además, en sus programas, ha utilizado un especificador de formato incorrecto para sizeof
el operador.
C11 §7.21.6.1 (P9):
Si una especificación de conversión no es válida, el comportamiento no está definido.275) Si algún argumento no es del tipo correcto para la especificación de conversión correspondiente, el comportamiento no está definido.
Por lo tanto, debe usar %zu
el especificador de formato en lugar de %d
; de lo contrario, es un comportamiento indefinido en C.