Por que é sizeof
considerado um operador e não uma função?
Qual propriedade é necessária para se qualificar como operador?
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 desizeof
- 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, aquisizeof
:sizeof unary-expression
esizeof ( 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:
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.fonte
E o padrão provavelmente está correto porque
sizeof
leva um tipo e(Wikipedia)
fonte
Porque não é uma função. Você pode usá-lo assim:
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.
fonte
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.
fonte
Porque:
sizeof
"função" não teria como determinar o tamanhofonte
Há 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!
fonte
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 ++.
fonte
sizeof()
operador é um tempo de compilação seria a ocorrência. Ele pode ser usado para determinar os parâmetros ou argumentos.fonte
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.
fonte