Sabemos que sizeof
é um operador usado para calcular o tamanho de qualquer tipo de dado e expressão, e quando o operando é uma expressão, os parênteses podem ser omitidos.
int main()
{
int a;
sizeof int;
sizeof( int );
sizeof a;
sizeof( a );
return 0;
}
o primeiro uso de sizeof
está errado, enquanto outros estão certos.
Quando ele é compilado usando gcc, a seguinte mensagem de erro será fornecida:
main.c:5:9: error: expected expression before ‘int’
Minha dúvida é por que o padrão C não permite esse tipo de operação. Vai sizeof int
causar alguma ambigüidade?
sizeof (int)a
.sizeof +(int)a
tem a vantagem*&
de realmente compilar ;-)+
. Por exemplo,sizeof +(char)a == sizeof(int)
devido à promoção de inteiros, é provavelmente menos sujeito a erros apenas colocar entre parênteses se houver alguma preocupação sobre a expressão da qual você está tentando calcular o tamanho. Então, eu não tenho certeza se chegaria a chamá-lo de "um uso", embora admita que o usei ...Respostas:
O seguinte pode ser ambíguo:
É isso
(sizeof (int*)) + 1
ou(sizeof(int)) * (+1)
?Obviamente, a linguagem C poderia ter introduzido uma regra para resolver a ambigüidade, mas posso imaginar por que isso não incomodou. Com a linguagem como está, um especificador de tipo nunca aparece "nu" em uma expressão e, portanto, não há necessidade de regras para determinar se esse segundo
*
é parte do tipo ou um operador aritmético.A gramática existente já resolve a ambigüidade potencial de
sizeof (int *) + 1
. É(sizeof(int*))+1
, nãosizeof((int*)(+1))
.C ++ tem um problema um pouco semelhante para resolver com a sintaxe de conversão de estilo de função. Você pode escrever
int(0)
e pode escrevertypedef int *intptr; intptr(0);
, mas não pode escreverint*(0)
. Nesse caso, a resolução é que o tipo "simples" deve ser um nome de tipo simples, não pode ser apenas qualquer id de tipo antigo que possa conter espaços ou pontuação à direita. Talvezsizeof
pudesse ter sido definido com a mesma restrição, não tenho certeza.fonte
new int*(X)
que seria ambíguo se C ++ não especificasse que o novo operador pega a string mais longa que poderia ser um tipo. Então, em C ++, eles poderiam ter feito o mesmo com sizeof, eu acho. Mas em C ++ você pode dizersizeof int()
qual seria ambíguo (tipo ou valor inicializado int?).sizeof int()
seria malformada ("nãooperator()
parasize_t
"), o que eu acho que seria indesejável!Do padrão C99
No seu caso,
int
não é uma expressão nem um nome entre parênteses.fonte
Existem duas maneiras de usar o operador sizeof em C. A sintaxe é esta:
Sempre que usar um tipo como operando, deve-se ter o parêntese, pela definição da sintaxe da linguagem. Se você usar sizeof em uma expressão, não precisará do parêntese.
O padrão C dá um exemplo de onde você pode querer usá-lo em uma expressão:
No entanto, por uma questão de consistência e para evitar bugs relacionados à precedência do operador, eu pessoalmente aconselharia sempre usar (), não importa a situação.
fonte
sizeof expression
esizeof(type)
, o que é explicado nesta resposta.