2012-07-25 13 views
21

Duplicar posible:
Size of character ('a') in C/C++¿Por qué la salida de este programa es diferente entre C y C++?

El siguiente programa

#include <stdio.h> 

int main() 
{ 
    printf("%d\n", sizeof('\0')); 
    printf("%d\n", sizeof(0)); 
} 

compilado con gcc salidas

4 
4 

y el ingenio h g ++

1 
4 

¿Por qué ocurre esto? Sé que esto no es una cosa de compilación, sino una diferencia entre C y C++, pero ¿cuál es el motivo?

+25

Más como _language_-dependiente! – Shahbaz

+0

¿Por qué estabas haciendo esto en primer lugar, por curiosidad? – Aerovistae

Respuesta

35

En C, el carácter constantes de tienen tipo int por 6.4.4.4 (10) de la norma,

una constante entera personaje tiene tipo int. El valor de una constante de caracteres enteros que contiene un único carácter que se asigna a un carácter de ejecución de un solo byte es el valor numérico de la representación del carácter correlacionado interpretado como un número entero.

Por lo tanto, está imprimiendo el tamaño de int dos veces.

En C++, las constantes de caracteres tienen el tipo char.

12

El \0 carácter literal es tratado como un int en C, por lo que en realidad terminan de imprimir sizeof(int) en lugar de sizeof(char).

ideone da los mismos resultados (C, C++).

+1

@Konrad, cierto, todo lo más pequeño que un 'int' se considera como' int' en C. Fixed. –

+0

No, eso tampoco es cierto, no * todo * se trata como 'int', solo literales de caracteres: http://ideone.com/ZQIPC –

+0

@Konrad, la prueba' short' en su ejemplo usa un molde.Por supuesto, no hay forma de expresar un literal 'corto', por lo que incluso un valor que se ajusta en 'corto' se analiza como 'int' desde el principio. De hecho, sería interesante saber si un posible 'corto' literal sería tratado de la misma manera que un 'char' uno ... –

4

En C los literales de caracteres son ints. En C++ son caracteres.

0

La salida ya es dependiente del compilador ya que utiliza el especificador de formato incorrecto para size_t esto sería %zu. En sistemas de 64 bits con size_t más ancho que int, esto podría generar cualquier tipo de basura.

De lo contrario, este shure depende del compilador. Ambos valores que intenta imprimir el tamaño son int en C y char y int en C++. Por lo tanto, en C esto generalmente debería darle 4 4 o 8 8 y en C++ 1 4 o 1 8.

Cuestiones relacionadas