Respostas:
Porque o padrão C diz isso, e ele recebe o único voto.
Como conseqüências:
sizeof (int)
, em vez de uma expressão de objeto.int a; printf("%d\n", sizeof a);
está perfeitamente bem. Eles são frequentemente vistos, em primeiro lugar porque são necessários como parte de uma expressão de conversão de tipo e, em segundo lugar, porque sizeof tem uma precedência muito alta, então sizeof a + b
não é o mesmo que sizeof (a+b)
. Mas eles não fazem parte da invocação de sizeof, eles fazem parte do operando.sizeof a++
não modifica a).Uma função seria diferente em todos esses pontos. Provavelmente existem outras diferenças entre uma função e um operador unário, mas acho que isso é o suficiente para mostrar por que sizeof não poderia ser uma função, mesmo que houvesse uma razão para querer que fosse.
sizeof
efeitos colaterais se houvesse um VLA na expressão.
(int)
não é nada sofisticado - apenas o nome de um tipo entre parênteses. Os parênteses aqui são uma parte da sintaxe de sizeof
- eles são obrigatórios ao tirar o tamanho de um tipo, mas não são obrigatórios ao tirar o tamanho de uma expressão. Veja, por exemplo, aqui
sizeof
: sizeof unary-expression
e sizeof ( type-name )
- portanto, no padrão C11 não é considerado um 'elenco', mas um nome de tipo entre parênteses. O resultado líquido é praticamente o mesmo. (Para comparação, uma expressão de elenco é ( type-name ) cast-expression
.) E odeio a maneira como o Markdown de comentário funciona de forma diferente do Markdown de perguntas e respostas!
Ele pode ser usado como uma constante de tempo de compilação, o que só é possível se for um operador em vez de uma função. Por exemplo:
union foo {
int i;
char c[sizeof(int)];
};
Sintaticamente, se não fosse um operador, teria que ser uma macro do pré-processador, pois as funções não podem aceitar tipos como argumentos. Essa seria uma macro difícil de implementar, pois sizeof
pode aceitar os tipos e as variáveis como argumento.
Porque o padrão C diz isso, e ele recebe o único voto.
E o padrão provavelmente está correto porque sizeof
leva um tipo e
Em geral, se o domínio ou codomínio (ou ambos) de uma função contiver elementos significativamente mais complexos do que os números reais, essa função é chamada de operador. Inversamente, se nem o domínio nem o codomínio de uma função contiverem elementos mais complicados do que os números reais, é provável que essa função seja chamada simplesmente de função. Funções trigonométricas como cosseno são exemplos do último caso.
Além disso, quando as funções são usadas com tanta frequência que evoluíram com notações mais rápidas ou mais fáceis do que a forma F (x, y, z, ...) genérica, as formas especiais resultantes também são chamadas de operadores. Os exemplos incluem operadores infixos, como adição "+" e divisão "/", e operadores pós-fixados, como fatorial "!". Esse uso não está relacionado à complexidade das entidades envolvidas.
Porque não é uma função. Você pode usá-lo assim:
int a;
printf("%d\n", sizeof a);
A função tem um ponto de entrada, código, etc. A função deve ser executada em tempo de execução (ou embutida), sizeof deve ser determinado em tempo de compilação.
O operador sizeof é uma entidade em tempo de compilação, não em tempo de execução e não precisa de parênteses como uma função. Quando o código é compilado, ele substitui o valor pelo tamanho daquela variável em tempo de compilação, mas na função após a função ser executada, saberemos o valor de retorno.
Porque:
sizeof
"função" não teria como determinar o tamanhoHá uma pequena diferença em relação à função - o valor de sizeof é resolvido em tempo de compilação, mas não em tempo de execução!
Porque é um operador em tempo de compilação que, para calcular o tamanho de um objeto, requer informações de tipo que só estão disponíveis em tempo de compilação. Isso não vale para C ++.
Sizeof (), acho que obviamente é uma função e um operador. Por quê? Porque uma função contém parênteses para entrada no estágio de entrada. Mas, principalmente, os operadores de causa do operador são caracteres de ação, portanto, sizeof é uma instrução de ação que atua no operando entre parênteses.