maneira prática de aprender C? [fechadas]

10

Eu quero me aprofundar em C e, normalmente, quando quero aprender um novo idioma, penso em uma meta de projeto simples / atingível que tenha algum objetivo prático (faça uso de uma API, automatize uma tarefa, etc.)

Estou tendo mais dificuldade em encontrar um para C, principalmente porque tudo o que leio aponta para o fato de que o uso principal de C atualmente está em sistemas embarcados e em projetos de software mais complexos, como sistemas operacionais.

Isso me indica o fato de que não preciso aprender ou que apenas preciso ser um pouco mais complicado na minha estratégia de aprendizado?

Referências a recursos de aprendizagem prática? (tutorial / como produzir um resultado final com algum objetivo / benefício)

jondavidjohn
fonte
3
Você obterá respostas mais sensatas se puder nos dizer POR QUE deseja aprender C?
Zvrba 29/08/11
2
Eu concordo com o zvrba. C é ótimo para coisas rápidas e de baixo nível e para código de driver. Se você está escrevendo código para jogos, também é ótimo (embora você provavelmente esteja trabalhando com codificadores C ++ que se queixam de você por escrever código "não padrão"). Eu sinto, porém, que Assembly e C são semelhantes ao latim (em idiomas falados), eles não foram os primeiros, mas a maioria que veio depois deles usou as idéias e construções deles para criar seus próprios idiomas. Assim, estudando C DEVE dar-lhe uma melhor compreensão das linguagens de alto nível
Jamie Taylor
Você já conferiu Learn C The Hard Way, de Zed Shaw . Tão prático quanto se pode obter, e muito grátis também.
Wyatt Barnett
a pessoa do Python the Hard Way agora tem livros para outros idiomas, incluindo uma versão alfa para C, eu começaria por aí. C é de alto nível uma grande diferença para asm, eu odeio a comparação com asm, pois é falso. Com certeza, ele permite que você faça o que outros idiomas não costumam. Não importa o que você deseja criar qualquer aplicativo que possa escrever em C, não há motivo para direcionar o aplicativo ao idioma.
Old_timer 30/05

Respostas:

27

Eu recomendaria apenas pegar uma cópia da linguagem de programação C de Kernighan e Ritchie (2ª edição) . No final de cada capítulo, há vários exercícios, além de uma introdução muito boa à linguagem C. Isso não fará de você um mestre do idioma, mas você deve ter uma compreensão boa o suficiente no final do livro e exercícios para talvez encontrar um projeto de código aberto escrito em C para o qual possa ler o código-fonte e talvez contribuir para.

Se você deseja ver projetos reais do mundo real com o código C neles. Está ficando mais difícil - muitos projetos usam uma linguagem de "nível superior", mas C ainda está vivo e chutando. Se você quer aprender C, não tenha medo de reinventar a roda para alcançar o aprendizado. Não é uma boa ideia reinventar soluções a qualquer hora, mas é perfeitamente bom fazê-lo como um exercício acadêmico.

Thomas Owens
fonte
11
Adicione as perguntas frequentes de comp.lang.c a isso. c-faq.com
Mike Sherrill 'Cat Recall'
3
+1 por não se importar em reinventar soluções para aprender.
um CVn
4
K&R é horrível por aprender um bom estilo de programação em geral e horrível por ensinar práticas de programação C seguras / sãs em particular. Todos os trechos de código contidos nele são ofuscados na melhor das hipóteses, na maioria das vezes eles ensinam hábitos totalmente perigosos. É um livro ultrapassado, eu não o recomendaria para nada além da nostalgia. É especialmente inadequado para programadores iniciantes.
2
@ Thomas Sim a 2ª edição. Você pode citar praticamente qualquer trecho de código e provavelmente posso apontar 2-3 casos de práticas perigosas / ruins. Vou abrir o livro agora mesmo e escolher um exemplo aleatório. Ok, vamos lá, p119: atribuição dentro de condições, uso de tipos de dados primitivos nativos, uso de int implícito (não assinado), lançamento de tipo de resultado de malloc (muito ruim!), Lançamento de parâmetro de liberação livre para anular * (por que ??? ), múltiplos retornos (também conhecido como espaguete), usando NULL sem #include apropriado, se sem {}.
2
+ 1 para KnR C. É a melhor (e mais concisa) introdução à programação em um idioma específico que eu já li. Como outros já apontaram, pode ser um pouco duvidoso em alguns lugares - o único conselho que daria é o seguinte: se já houve um manual de programação que exigisse que você lesse a sinopse circundante, é isso. Em geral, você pode descobrir outras coisas no bloco de código, mas este livro exige que você o leia de capa a capa, pelo menos uma vez.
Jamie Taylor
1

Você precisará entender realmente a alocação de memória. Parece que você já usou outros idiomas antes, mas as chances são de que esses outros idiomas ocultassem os detalhes sangrentos do gerenciamento de memória. Em C, o gerenciamento de memória é sempre explícito. Existem algumas vantagens nisso, mas isso significa que você precisa ter cuidado para acertar ou todo o inferno se abrirá.

Use os recursos de depuração de memória disponíveis para a plataforma que você usa. Para o Linux, existe o Electric Fence, no Mac OS X o Guard Malloc. Também existe o Valgrind, que suporta vários sistemas operacionais.

Se você não conseguir liberar memória que deve ser liberada, haverá um vazamento de memória. Continue fazendo isso e você ficará sem memória. Mesmo com o armazenamento de backup (o que a maioria das pessoas chama de memória virtual), você pode fazer com que o sistema pagine excessivamente ou até fique sem espaço de troca.

Se você liberar memória que já foi liberada, corromperá a pilha e a falha, mas provavelmente não imediatamente. Você também corromperá a pilha se exceder um buffer. As ferramentas de depuração de memória ajudarão com tudo isso.

O teste de unidade também ajuda.

Mike Crawford
fonte
0

Concordo com a maioria das pessoas aqui que hoje os idiomas são determinados pela tarefa em questão. Houve um tempo em que você teve uma escolha limitada a esse respeito. Hoje, o C é usado principalmente no domínio de programação Embedded / System, onde há necessidade de otimização de código. Você precisa escrever códigos precisos para obter o máximo, porque, se alguma vez você começar a usar essa abstração, o material subjacente deverá ser muito robusto. Eu diria que você tenta contornar alguns projetos GNU de código aberto, como o próprio Linux ou algo que precisa de desenvolvedores em C. Tente sua mão nesses projetos em vez de escrever algo do zero em C. Esta é provavelmente a melhor maneira de escrever códigos e aprender um idioma.

Nishant
fonte
Na verdade, duvido que pular de cabeça em um projeto estabelecido, mesmo que menor, seja uma boa maneira de começar a aprender um idioma do zero. É provável que você entrar em forma sobre sua cabeça, e também terá o encargo adicional de simplesmente tentar navegar o código, mesmo se tudo o que se propôs a fazer é compreender como funciona o código. Um kernel do sistema operacional, em particular, é um software incrivelmente complexo.
um CVn
Sim, mas estou assumindo que o questionador realmente passou pelo livro de K&R ou algo assim. Me recomendaram essa abordagem quando perguntei no canal Python. Seria diferente em C?
Nishant
Estritamente falando, eu não sei se seria muito diferente, mas em C, você precisa prestar muito mais atenção aos detalhes detalhados do que em uma linguagem de alto nível, como Python. Gerenciamento de memória, para mencionar apenas uma coisa. Entrar em um projeto potencialmente grande e estabelecido quando você está apenas começando um idioma pode não ser a melhor maneira de fazê-lo.
um CVn
0

Você vai querer fazer algo que funcione na linha de comando. A programação da GUI em C é uma grande dor de cabeça, mesmo com uma boa estrutura de GUI.

Minha sugestão usual para uma experiência prática de aprendizado em C tem sido uma lista de contatos ou outro aplicativo simples de gerenciamento de dados. Isso abrangerá a maioria dos bits importantes (E / S, gerenciamento de memória, processamento de texto etc.), e você não precisará usar nada fora da biblioteca C padrão para realizá-lo. O C não possui nenhum suporte interno para gráficos, rede, som ou muito mais 1 ; portanto, para sua primeira incursão na programação C, é melhor evitar qualquer coisa que dependa desse tipo de coisa.

C pode ser usado para programação de uso geral; você apenas precisa diminuir um pouco suas expectativas (imagine que seja 1983 e você está sentado na frente de um VT52 conectado a um VAX 11/750 e estará na mentalidade certa).

Lembre-se de que C não tem guardas de lâmina e não impedirá que você faça algo estúpido. A definição de idioma é um pouco solta em alguns lugares, e há algumas operações que não são ilegais como tais, mas também não são bem definidas.


1 - A revisão mais recente (2011) do padrão de idioma adicionou suporte de encadeamento interno

John Bode
fonte
0

Eu recomendo o Projeto Euler . Eu o usei para melhorar meu C ++ e é incrível. É ótimo porque cada problema é uma pequena tarefa que pode levar menos de uma hora para ser concluída (pelo menos as primeiras).

Você precisará de um criador de perfil e um livro sobre como otimizar o código de velocidade. Certifique-se de seguir a regra de 1 minuto: você deve obter a resposta dentro de 1 minuto.

B Seven
fonte
0

Se você JÁ é um programador e APENAS precisa aprender C, e não se importa em aprender uma versão mais antiga da linguagem (o núcleo ainda é praticamente o mesmo), o "C para programadores" de Leendert Ammeraal não pode ser derrotado . Trabalhe com isso, do começo ao fim.

John R. Strohm
fonte