Devo aprender C antes de aprender C ++? [fechadas]

117

Eu visitei um dia de abertura do departamento de ciência da computação da universidade hoje e na turnê dos laboratórios nós sentamos para brincar com alguns projetos do último ano de alunos de graduação. Um era particularmente bom - uma espécie de jogo de asteróides FPS. Decidi dar uma olhada no srcdiretório para descobrir que era feito em C ++ (a maioria dos outros projetos eram aplicativos Java 3D).

Eu não fiz nenhum C antes, mas já olhei alguns códigos C antes. Pelo que vi no código .cpp deste jogo, não parecia muito diferente.

Estou interessado em aprender C ou C ++, mas provavelmente irei aprender o outro mais tarde. Há alguma vantagem em aprender um antes do outro e, se sim, qual?

Ross
fonte
Duplicado: stackoverflow.com/questions/171126/…
David Segonds
7
Não é realmente uma duplicata. Implicitamente, esta pergunta também pergunta "devo aprender OOP ou programação procedural primeiro"
bobobobo
2
Antes de descer para o abaixo respostas (IMO eles vão em círculos), permitam-me oferecer alguns conselhos: VERDADEIRO : C ++ não reter todas as características e atributos aplicada a C, assim, implicitamente ' obsoleting ' C (O ponto mais de respostas abaixo try fazer). NO ENTANTO : C não é , não , NÃO MORTO. As pessoas parecem agarrar-se ao tropo do " não há necessidade de aprender os dois ", mas na realidade isso não tem base. Para sintaxe borrow provenientes de C, C ++! = C . Saber C ++ NÃO o tornará um desenvolvedor C qualificado e, da mesma forma, saber C NÃO o tornará um desenvolvedor C ++ qualificado.
Super Cat
4
ISSO DISSE : Não há mal nenhum em aprender C antes de se aprofundar em C ++ - quanto mais você sabe, melhor você fica - Mas, ao contrário, não há necessidade de aprender C se seu objetivo final é aprender C ++ . SE você quer aprender C ++, ir aprender C ++ , e se você quiser t aprender C, ir aprender C . Ambos têm prós e contras (A simplicidade do C e os recursos -ultra in depth do C ++ são maldições e bênçãos em seus próprios caminhos), e ambos ainda são usados ​​hoje (C para sistemas embarcados, Unity, PHP, etc - C ++ também para Unity, Unreal, etc).
Super Cat
3
PONTO: Quer aprender C ++? Em seguida, pule C. Você não precisa disso. Quer aprender C? Então, ótimo, vá aprender C. Se você quiser aprender os dois, vá para C primeiro. Ambos têm seus lugares no mundo, então não pense que um é suficiente para o outro.
Super Cat

Respostas:

121

Não há necessidade de aprender C antes de aprender C ++.

São línguas diferentes . É um equívoco comum pensar que C ++ é de alguma forma dependente de C e não de uma linguagem totalmente especificada por si só.

Só porque o C ++ compartilha muito da mesma sintaxe e muito da mesma semântica, não significa que você precisa aprender C primeiro.

Se você aprender C ++, eventualmente aprenderá a maior parte de C, com algumas diferenças entre as linguagens que aprenderá com o tempo. Na verdade, é muito difícil escrever C ++ adequado porque os programadores intermediários de C ++ tendem a escrever C / C ++. Isso é verdade quer você tenha começado com C ou com C ++ ou não.

Se você conhece C primeiro, isso é uma boa vantagem para aprender C ++. Você começará conhecendo um pedaço da língua. Se você não conhece C primeiro, não há motivo para focar em uma linguagem diferente. Existem muitos bons livros e tutoriais disponíveis que o iniciam do nada e cobrem qualquer coisa que você aprenderia com C que se aplica a C ++ também.

Por favor, veja mais motivos nesta resposta .

Brian R. Bondy
fonte
33
Eu não poderia discordar mais. Aprender C ++ primeiro torna a experiência muito difícil "voltar" para C. C é uma linguagem de sistemas fundamental, apenas noções básicas. C ++ é um jogo totalmente novo, as abordagens para qualquer problema em qualquer linguagem serão muito diferentes. Tive a sorte de mexer em C antes de pular para um trabalho em C ++. Posteriormente, sou capaz de "ferver" mentalmente o açúcar sintático que o C ++ fornece e posso abordar problemas com qualquer uma das linguagens. É muito fácil para mim identificar C como a parte "faz coisas" do par de idiomas. Aprender C ++ primeiro levará a programadores confusos e enganados.
Matt Joiner
24
@Matt: Aprendi C ++ primeiro e não sou um programador enganado. Portanto, sua afirmação não é verdadeira, prova por contra-exemplo. E sim, eu também tenho um emblema dourado em C. A verdade da questão é que são 2 línguas distintas e diferentes. Você não precisa de um idioma como dependência para aprender o outro. Isso é apenas um equívoco bobo.
Brian R. Bondy
8
@Matt: Também do meu post vinculado: Você deve aprender C ++ primeiro, não porque aprender C primeiro vá te machucar, não porque você terá que desaprender alguma coisa (você não vai), mas porque não há benefício em aprender C primeiro. Você acabará aprendendo quase tudo sobre C de qualquer maneira, porque está mais ou menos contido em C ++.
Brian R. Bondy
11
@Matt: Lamento que você ainda não tenha entendido. Desenhe um diagrama de Venn de C e C ++ e observe as partes que se cruzam. C ++ é composto de todo o círculo C ++ que você desenha, não apenas as partes que não estão se cruzando. Se você conhece C primeiro, bom para você, você pode aprender C ++ mais rápido. Se por acaso você não souber C primeiro, não há razão para aprender primeiro. Você acha que todo livro sobre C ++ não cobrirá ponteiros e gerenciamento de memória, literais de string, etc.? Vou parar de discutir agora, mas fique à vontade para deixar seus comentários finais.
Brian R. Bondy
11
@Matt: como o C leva a um melhor entendimento do C ++? Normalmente, os programadores C que aprendem C ++ acabam escrevendo um código de estilo "C com classes" feio e sujeito a erros. Não estou dizendo que isso sempre aconteça, mas é a progressão mais natural quando se começa com C, porque C está muito mais próximo daquele estilo horrível de C ++ do que do C ++ "moderno".
jalf
76

Adoro esta pergunta - é como perguntar "o que devo aprender primeiro, snowboard ou esqui"? Acho que depende se você quer fazer snowboard ou esquiar. Se você quiser fazer os dois, precisa aprender os dois.

Em ambos os esportes, você desliza colina abaixo na neve usando dispositivos suficientemente semelhantes para provocar essa pergunta. No entanto, eles também são suficientemente diferentes para que aprender um não o ajude muito com o outro. A mesma coisa com C e C ++. Embora pareçam ser linguagens suficientemente semelhantes em sintaxe, a mentalidade necessária para escrever código OO versus código procedural é suficientemente diferente para que você praticamente tenha que começar do início, seja qual for a linguagem que aprender em seguida.

cdonner
fonte
70

Aprendi C primeiro e fiz um curso de estruturas de dados que usavam C, antes de aprender C ++. Isso funcionou bem para mim. Um curso de estruturas de dados em C me deu uma sólida compreensão de ponteiros e gerenciamento de memória. Também tornou óbvios os benefícios do paradigma orientado a objetos, uma vez que eu aprendi o que era.

Por outro lado, aprendendo C primeiro, desenvolvi alguns hábitos que inicialmente me fizeram escrever código C ++ incorreto, como o uso excessivo de ponteiros (quando as referências de C ++ funcionariam) e o pré-processador.

C ++ é realmente uma linguagem muito complexa com muitos recursos. Não é realmente um superconjunto de C, no entanto. Em vez disso, há um subconjunto de C ++ que consiste nas construções de programação procedural básicas (loops, ifs e funções), que é muito semelhante a C. No seu caso, eu começaria com isso e, em seguida, trabalharia para conceitos mais avançados como classes e modelos.

A coisa mais importante, IMHO, é ser exposto a diferentes paradigmas de programação, como procedural, orientado a objetos, funcional e lógico, desde o início, antes que seu cérebro congele em uma maneira de ver o mundo. A propósito, eu também recomendo fortemente que você aprenda uma linguagem de programação funcional, como Scheme. Isso realmente expandiria seus horizontes.

Dima
fonte
18

Se você decidir aprender ambos (e como outras pessoas mencionaram, não há necessidade explícita de aprender ambos), aprenda C primeiro. Ir de C para C ++ parece uma progressão natural; ir para o outro lado é como amarrar deliberadamente uma mão atrás das costas. :-)

Head Geek
fonte
13

Acho que você deve aprender C primeiro, porque aprendi C primeiro. C me deu uma boa compreensão da sintaxe e dicas com coisas como ponteiros, que fluem para C ++.

Acho que C ++ torna mais fácil encerrar todas essas pegadinhas (precisa de uma matriz que não estourará quando você usar o operador [] e um índice duvidoso? Claro, faça uma classe de matriz que faça a verificação de limites), mas você precisa saber o que eles são e são mordidos por eles antes que você entenda por que as coisas são feitas de certas maneiras.

Quando tudo estiver dito e feito, a forma como C ++ é geralmente ensinado é "C ++ é C com objetos, aqui está o material C e aqui está como funciona todo esse material OO", então é provável que você aprenda C básico antes de qualquer C ++ real se você siga a maioria dos textos de qualquer maneira.

Adam Hawes
fonte
Discordo. Qualquer livro de programação C ++ que valha a pena cobrir pelo menos algumas das "pegadinhas", como como os arrays funcionam (e como evitar o estouro)
moonman239
11

Vou discordar da maioria aqui. Acho que você deve aprender C antes de aprender C ++. Definitivamente não é necessário, mas acho que torna o aprendizado de C ++ muito mais fácil. C é o cerne do C ++. Tudo o que você aprender sobre C é aplicável a C ++, mas C é muito menor e mais fácil de aprender.

Pegue K&R e leia isso. É curto e lhe dará uma noção suficiente da linguagem. Depois de ter o básico sobre ponteiros e chamadas de função, você pode passar para C ++ um pouco mais facilmente.

Steve Rowe
fonte
15
Errado. Praticamente tudo que C ensina a você é uma má prática em C ++. C não é o cerne do C ++, ele simplesmente compartilha muita sintaxe. Por favor, o mundo já tem programadores "C com classes" mais do que suficientes. Aprenda C ou C ++. Mas não finja que C é um C ++ lite.
jalf
13
Eu mantenho minhas palavras. C ++ é construído em cima de C e, portanto, C está em seu coração. Os idiomas usados ​​em C ++ são muito diferentes daqueles usados ​​em C, mas a sintaxe é a mesma. Pode-se aprender a maneira certa de programar C ++ começando com C. Veja o C ++ Primer. Basicamente, faz isso.
Steve Rowe
6
+1. C é uma linguagem menor, portanto mais fácil de aprender. A tentativa de compatibilidade retroativa com C é uma fonte dos principais problemas com C ++, outra sendo o sistema de template que é muito complicado para 90% dos programadores de C ++ usarem.
hillu 01 de
1
Uma compreensão das variáveis, tipos [incluindo ponteiros e qualificações], escopo, funções, o pré-processador e ligação é essencial para C e C ++. Eu diria que aprender esses conceitos com C será mais fácil para que você não tenha que lidar também com o conhecimento de classes, outro significado de static, modelos (e os erros de modelo ridiculamente intimidantes que os compiladores emitem) etc.
dreamlax
1
Você tem um ponto. Na verdade, pode ser bom aprender C para que você possa passar para C ++ com um melhor conhecimento de suas raízes.
Daniel Daranas
10

No processo de aprendizagem de C ++, você aprenderá a maior parte de C também. Mas tenha em mente que muitos códigos C ++ não são válidos. C ++ foi projetado para ser compatível com o código C, então eu diria que você aprende C ++ primeiro. Brian escreveu uma ótima resposta sobre isso.

John T
fonte
8

Aprender C força você a pensar mais sobre alguns problemas, como gerenciamento de memória explícito e implícito ou tamanhos de armazenamento de tipos de dados básicos no momento em que você escreve seu código.

Depois de chegar a um ponto em que se sinta confortável com os recursos e características incorretas do C , provavelmente você terá menos problemas para aprender e escrever em C ++.

É totalmente possível que o código C ++ que você viu não parecesse muito diferente do C padrão, mas isso pode muito bem ser porque não era orientado a objetos e não usava exceções, orientação a objetos, modelos ou outros recursos avançados.

Hillu
fonte
8

Não.

Geralmente é mais útil aprender C ++ porque está mais próximo das linguagens mais modernas baseadas em OO, como Eiffel ou C #.

Se seu objetivo é aprender C ++, aprenda C ++ moderno e padrão em primeiro lugar. Deixe os mallocs de lado.


Mas Steve Rowe tem razão ...

Daniel Daranas
fonte
C ++ hoje em dia não está mais perto de linguagens OO como C # ou Eifel.
einpoklum
7

Como as respostas a muitas outras perguntas na vida, depende. Depende de quais são seus interesses e objetivos de programação. Se você deseja programar aplicativos de desktop, talvez com uma GUI, então C ++ (e OOP) é ​​provavelmente a melhor maneira de fazer. Se você estiver interessado em programação de hardware em algo diferente de um chipset x86, C geralmente é a melhor escolha, geralmente por sua velocidade. Se você deseja criar um novo media player ou escrever um aplicativo de negócios, eu escolheria C ++. Se você quiser fazer simulações científicas de colisões de galáxias ou dinâmica de fluidos, observe o poder de C.

Scottie T
fonte
4
Em muitos cenários de computação de alto desempenho, essas poucas centenas de ciclos de clock realmente importam.
Scottie T
1
@ScottieT: Considerando que, além do restrictespecificador, C não tem nenhuma outra construção sintática / semântica relacionada ao desempenho do que C ++ também, por que exatamente você acha que o código C ++, com sua sintaxe mais rica e, por exemplo, metaprogramação deve produzir um código mais lento? Você conhece modelos de expressão?
Sebastian Mach
1
@phresnel: Relevância. C ++ é uma linguagem extremamente complexa com recursos que geralmente não valem a pena serem comprados. Como regra geral, C oferece as mesmas oportunidades de desempenho que C ++ a um custo significativamente menor em complexidade.
Matt Joiner
1
@MattJoiner: Capacidade de manutenção / extensibilidade também são fatores de desempenho, embora eu saiba que o código científico costuma ser único. No entanto, repetindo o argumento de modelos de expressão (como um exemplo), digo que C ++ tem mais oportunidades de otimização, (também porque é mais fácil escrever código de modelo de expressão do que código intrínseco), com uma exceção ( restrictque, no entanto todos os principais compiladores C ++ fornecem uma extensão). E você realmente acha que, dado o mesmo código, haverá alguma diferença de desempenho entre C ++ e C, dado o mesmo compilador? [...]
Sebastian Mach
1
@MattJoiner: [...], e ao ler declarações como "tanto quanto eu não gosto de C ++", deixe-me supor que você está um pouco tendencioso nesta discussão. O que exatamente você acha que faz o código C ++ ter um desempenho pior? Se C tem as mesmas oportunidades de desempenho, qual é o equivalente a modelos de expressão, modelos em geral, cálculos em tempo de compilação em tipos de dados não intrínsecos, functores? E adicionando o fator de custo / manutenção: RAII, sobrecarga de operador / função, contêineres padrão genéricos, threads padrão, algoritmos padrão genéricos, referências?
Sebastian Mach
7

Acho que aprender C primeiro é uma boa ideia.

Há uma razão pela qual os cursos de ciências computacionais ainda usam C.

Em minha opinião, é para evitar todo o "congestionamento" do assunto que a obrigação de exigir carrega OOP.

Acho que a programação procedural é a maneira mais natural de primeiro aprender a programar. Acho que isso é verdade porque no final do dia é o que você tem: linhas de código executando uma após a outra.

Muitos textos hoje estão empurrando uma abordagem "objetos primeiro" e começam a falar sobre carros e mudanças de marcha antes de introduzir matrizes.

bobobobo
fonte
4
Parece que muitos cursos de ciências computacionais atualmente usam Java, o que agrava o problema do qual você está falando.
Dima
2
Você fez um ponto muito bom. Além de ser muito complicado para uma primeira linguagem, C ++ na maior parte encoraja a ocultação da interação de baixo nível com o sistema operacional e a memória que são essenciais para um bom ensino de ciência da computação. As matrizes devem ser ensinadas muito antes dos objetos.
Matt Joiner
1
Por outro lado, se você não é ruim em matemática, a programação funcional pode ser mais natural, porque parece e funciona e parece mais familiar.
Sebastian Mach
2
"Há uma razão pela qual os cursos de ciência da computação ainda usam C." Sim, porque a maioria dos cursos de computação científica são mal ministrados.
Lightness Races in Orbit
6

Tendo observado pessoas que aprenderam Java primeiro, lutam com os conceitos de ponteiros e gerenciamento de memória em C ++, eu diria que aprender C primeiro é uma boa ideia, a fim de compreender esses dois conceitos, isolados das complexidades de outros C ++. recursos.

TrayMan
fonte
5

Meus dois centavos:

Sugiro aprender C primeiro, porque:

  • é uma linguagem fundamental - muitas línguas descendem do C
  • mais plataformas suportam compilador C do que C ++, - sejam sistemas embarcados, chips GPU, etc.
  • de acordo com o índice TIOBE, C ainda é cerca de 2 vezes mais popular do que C ++.
Agnius Vasiliauskas
fonte
3

Eu acho que c é uma linguagem de programação muito boa, é compacta e um tanto fácil de aprender. mas se você quiser apenas aprender c ++, comece com c ++. mas eu sugiro que você aprenda ambos. e se você quiser fazer isso; acho melhor começar com c. como disse antes: é pequeno e um tanto fácil de aprender. pode ser um bom avanço para uma linguagem de programação mais complexa como c ++. (já que c fornece alguns princípios básicos)

boa sorte.

Marnix v. R.
fonte