Só agora estou aprendendo sobre C.
Acho estranho que os criadores tenham escolhido o asterisco ( *
) como símbolo para ponteiros, em vez de um símbolo que realmente se parece com um ponteiro ( ->
).
Considerando como podem ser confusos os desvios de referência e os indicadores de função, existe uma razão histórica ou mesmo prática para usar o asterisco?
->
está sendo usado na linguagem C como um operador de desreferência - ao acessar campos em uma struct:,struct_pointer->field
que é a abreviação de(*struct_pointer).field
.structs
desreferenciamento, o que me pareceu estranho. É um símbolo de ponteiro, certo? Por que não (<-
) para desreferenciar? Eu sou realmente o único que pensa assim?^
é usado e pode ser pensado em uma seta girada e lido como "apontar para", mesmo significado,->
porém mais curto.^integer
significa "ponteiro para número inteiro" para declaração de tipo evar^
significa "a memóriavar
aponta para" para desreferenciação. A posição do símbolo é mais lógica que C ao ler da esquerda para a direita, que sempre coloca após o tipo e antes do nome da variável. Usos também Pascal@
para a tomada de endereço, que é melhor do que&
, porque@var
é "o endereço em que var está localizado"Respostas:
Simplesmente - porque B sim.
Do desenvolvimento da linguagem C
É isso aí. Nesse ponto, a pergunta é tão desinteressante quanto "por que o python 3 usa
.
para chamar um método? Por que não->
?" Bem ... porque o Python 2 costuma.
chamar um método.Raramente existe uma linguagem do nada. Ele tem influências e é baseado em algo que veio antes.
Então, por que B não usou
!
para remover o ponteiro de um ponteiro como o seu BCPL predecessor?Bem, o BCPL era um pouco prolixo. Em vez de
&&
ou||
BCPL usadologand
elogor
. Isso ocorreu porque a maioria dos teclados não possui teclas∧
ou∨
não é igual à palavraNEQV
(consulte o Manual de referência da BCPL ).B parece ter sido parcialmente inspirado para reforçar a sintaxe, em vez de ter palavras longas para todos esses operadores lógicos que os programadores faziam com bastante frequência. E assim
!
a desreferência se tornou*
para que!
pudesse ser usada para negação lógica. Observe que há uma diferença entre o*
operador unário e o*
operador binário (multiplicação).O
->
foi levado para o açúcar sintático torno derefrences campostruct_pointer->field
que é(*struct_pointer).field
Outras opções como
<-
poderiam criar análises ambíguas. Por exemplo:Isso deve ser lido como:
ou
É muito provável que criar um operador unário composto por um operador binário e outro operador unário tenha problemas, pois o segundo operador unário pode ser um prefixo para outra expressão.
Além disso, é novamente importante tentar reduzir ao mínimo as coisas que estão sendo digitadas. Eu odiaria ter que escrever:
Isso também se torna difícil de ler.
Outros caracteres podem ter sido possíveis (
@
não foram usados até o Objetivo C se apropriar ). Porém, novamente, isso vai para o núcleo de 'C usa*
porque B fez'. Por que B não usou@
? Bem, B não usou todos os personagens. Não havia nenhumbpp
programa (compare cpp ) e outros caracteres estavam disponíveis em B (como o#
que mais tarde foi usado pelo cpp).Se posso arriscar um palpite sobre o porquê - é por causa de onde estão as chaves. De um manual em B :
Observe que
&
é o turno-7 e o*
turno-8. A proximidade entre eles pode ter sido uma dica para o programador sobre o que eles fazem ... mas isso é apenas um palpite. Alguém teria que perguntar a Ken Thompson sobre por que essa escolha foi feita.Então, aí está. C é assim porque B era. B é assim porque queria mudar a forma como o BCPL era.
fonte
@
que teria sido outra possibilidade.&
e*
). B também não usou,#
então havia mais algumas peças de reposição por aí ... há também$
.Um aluno me perguntou se
&
e fui*
escolhido porque eles estavam próximos um do outro no teclado (algo que eu nunca havia notado antes). Muita pesquisa no Google me levou à documentação B e BCPL e a esta discussão. No entanto, não consegui encontrar muita coisa. Parecia que havia muitas razões para*
B, mas não consegui encontrar nada&
.Então, seguindo a sugestão de @ MichaelT, perguntei a Ken Thompson:
fonte