¿Por qué el tamaño de un carácter sizeof('a') es diferente en C y C++? [duplicar]

Resuelto whacko__Cracko asked hace 14 años • 4 respuestas
#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 chares de 1 byte tanto en C como en C++.

whacko__Cracko avatar Feb 01 '10 02:02 whacko__Cracko
Aceptado

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.

 avatar Jan 31 '2010 19:01

Como dijo Paul, es porque 'a'está inten C pero charen 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

David R Tribble avatar Aug 13 '2012 19:08 David R Tribble

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
Kite avatar Jan 05 '2015 16:01 Kite

En lenguaje C , el carácter literal no es un chartipo. 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 sizeofel 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 %zuel especificador de formato en lugar de %d; de ​​lo contrario, es un comportamiento indefinido en C.

msc avatar Nov 01 '2017 10:11 msc