Estou pensando em aprender C
Não há razão específica para não aprender C, mas eu sugeriria C ++. Ele oferece muito do que C faz (já que C ++ é um superconjunto de C), com uma grande quantidade de "extras". Aprender C antes do C ++ é desnecessário - eles são linguagens efetivamente separadas.
Em outras palavras, se C fosse um conjunto de ferramentas para trabalhar madeira, provavelmente seria:
- martelo
- unhas
- serra manual
- furadeira
- lixadeira de bloco
- cinzel (talvez)
Você pode criar qualquer coisa com essas ferramentas - mas qualquer coisa legal potencialmente exige muito tempo e habilidade.
C ++ é a coleção de ferramentas elétricas em sua loja de ferragens local.
Se você seguir os recursos básicos da linguagem, o C ++ terá relativamente pouca curva de aprendizado adicional.
Mas por que as pessoas usam C (ou C ++) se podem ser usadas 'perigosamente'?
Porque algumas pessoas não querem móveis da IKEA. =)
Sério, embora muitas linguagens "mais altas" que C ou C ++ possam ter coisas que as tornam (potencialmente) "mais fáceis" de usar em certos aspectos, isso nem sempre é uma coisa boa. Se você não gosta da maneira como algo é feito ou o recurso não é fornecido, provavelmente não há muito o que fazer sobre isso. Por outro lado, C e C ++ fornecem recursos de linguagem de "baixo nível" suficientes (incluindo ponteiros) para que você possa acessar muitas coisas diretamente (especialmente hardware ou sistema operacional) ou construí-lo você mesmo, o que pode não ser possível em outros idiomas conforme implementado.
Mais especificamente, C possui o seguinte conjunto de recursos que o tornam desejável para muitos programadores:
- Velocidade - Devido à sua relativa simplicidade e otimizações do compilador ao longo dos anos, é nativamente muito rápido. Além disso, muitas pessoas descobriram muitos atalhos para objetivos específicos ao usar o idioma, o que o torna potencialmente ainda mais rápido.
- Tamanho - Por razões semelhantes às listadas para velocidade, os programas C podem ser muito pequenos (tanto em termos de tamanho de executável quanto de uso de memória), o que é desejável para ambientes com memória limitada (por exemplo, embutida ou móvel).
Compatibilidade - C já existe há muito tempo e todos têm ferramentas e bibliotecas para isso. A linguagem em si também não é exigente - ela espera que um processador execute instruções e memória para armazenar as coisas, e é isso.
Além disso, há algo conhecido como ABI (Application Binary Interface) . Em resumo, é uma maneira de os programas se comunicarem no nível do código da máquina, o que pode ter vantagens sobre uma API (Application Programming Interface) . Enquanto outras linguagens como C ++ podem ter uma ABI, normalmente elas são menos uniformes (acordadas) que as de C, portanto, C é uma boa linguagem básica quando você deseja usar uma ABI para se comunicar com outro programa por algum motivo.
Por que os programadores não usam apenas Java ou Python ou outra linguagem compilada como o Visual Basic?
Eficiência (e ocasionalmente esquemas de gerenciamento de memória que não podem ser implementados sem acesso relativamente direto à memória).
O acesso direto à memória com ponteiros apresenta muitos truques legais (geralmente rápidos) quando você pode colocar suas patas sujas nas crianças e zeros nos cubos de memória diretamente e não ter que esperar que o professor velho distribua os brinquedos apenas na hora de brincar, pegue-os novamente.
Em suma, adicionar coisas potencialmente cria lag ou, de outra forma, introduz uma complexidade indesejada.
Com relação às linguagens de script e esse tipo, você precisa trabalhar duro para que as linguagens que exigem que os programas secundários sejam executadas com a mesma eficiência que o C (ou qualquer linguagem compilada) nativamente. A adição de um intérprete on-the-fly introduz inerentemente a possibilidade de menor velocidade de execução e maior uso de memória, porque você está adicionando outro programa ao mix. A eficiência de seus programas depende tanto da eficiência deste programa secundário quanto de quão bem (ruim =)) você escreveu o código do programa original. Sem mencionar que seu programa geralmente depende completamente do segundo programa para ser executado. Esse segundo programa não existe por algum motivo em um sistema específico? Código no go.
De fato, a introdução de algo "extra" potencialmente diminui ou complica seu código. Nas linguagens "sem ponteiros assustadores", você está sempre esperando que outros bits de código sejam limpos atrás de você ou, de outra forma, descubra maneiras "seguras" de fazer as coisas - porque seu programa ainda está fazendo as mesmas operações de acesso à memória que poderiam ser feitas com ponteiros. Você não é quem está lidando com isso (então você não pode f * ck, gênio = P).
Por perigoso, quero dizer com ponteiros e outras coisas semelhantes. [...] Como a pergunta Stack Overflow Por que a função gets é tão perigosa que não deve ser usada?
De acordo com a resposta aceita:
"Ele permaneceu uma parte oficial do idioma até o padrão ISO C de 1999, mas foi oficialmente removido pelo padrão de 2011. A maioria das implementações de C ainda o suporta, mas pelo menos o gcc emite um aviso para qualquer código que o use".
A noção de que, como algo pode ser feito em um idioma, deve ser feito é bobagem. Os idiomas têm falhas corrigidas. Por motivos de compatibilidade com código antigo, essa construção ainda pode ser usada. Mas não há nada (provável) forçando um programador a usar gets () e, de fato, esse comando foi essencialmente substituído por alternativas mais seguras.
Mais ao ponto, o problema com gets () não é um problema de ponteiro por si só. É um problema com um comando que não necessariamente sabe como usar a memória com segurança. Em um sentido abstrato, tudo isso é questão de ponteiro - ler e escrever coisas que você não deveria. Isso não é um problema com ponteiros; é um problema com a implementação do ponteiro.
Para esclarecer, os ponteiros não são perigosos até você acessar acidentalmente um local de memória que não pretendia. E mesmo assim, isso não garante que o seu computador derreta ou exploda. Na maioria dos casos, seu programa deixará de funcionar (corretamente).
Dito isto, como os ponteiros fornecem acesso aos locais da memória e porque os dados e o código executável existem juntos na memória, há um risco real de corrupção acidental o suficiente para que você queira gerenciar a memória corretamente.
Nesse ponto, como as operações de acesso à memória realmente diretas geralmente oferecem menos benefícios em geral do que poderiam ter anos atrás, mesmo linguagens sem coleta de lixo como o C ++ introduziram coisas como ponteiros inteligentes para ajudar a preencher a lacuna entre eficiência e segurança da memória.
Em resumo, há muito poucas razões para temer o ponteiro, desde que seja usado com segurança. Basta dar uma dica da versão de Steve "The Hunter Crocodile" Irwin, de South Park - não saia por aí enfiando o polegar nos buracos dos crocodilos .