guidjos 65 Denunciar post Postado Janeiro 5, 2011 Olá. Se você não programa há muito tempo, provavelmente vê os termos "C" e "C++" usados juntos com frequência. Este post tem como objetivo simplesmente explicitar a (grande) diferença entre as duas linguagens. Primeiramente, como pode-se inferir pela frase acima, ambas são duas linguagens totalmente diferentes. Os comitês que as desenvolvem são completamente diferentes, e os especialistas que as utilizam frequentemente criticam fortemente uma das duas - e glorificam a que usam. A similaridade sintática (que não é perfeita) não é nem de perto motivo para considerar as duas como sendo parte de um mesmo todo. Além da orientação a objetos, suporte a templates (tipos genéricos) e overload de operadores, as duas linguagens diferem em diversos pontos. Alguns deles: 1. C usa ponteiros para void para manipular dados de tipo desconhecido. Para isso, programadores podem atribuir valores de ponteiros para void a ponteiros para outros tipos, sem problema algum (e sem necessidade de casting). malloc(), realloc(), calloc() e free() são exemplos de funções que utilizam void * e que possibilitam que se trabalhe com ponteiros para quaisquer tipos de dados. Em C++, isso não é permitido. Portanto, o seguinte código, que é completamente correto (e até recomendado) em C, não é correto em C++: char *a = malloc(30); // malloc() retorna void *, que, aqui, é corretamente atribuído a "a" sem necessidade de cast 2. C++ possui os operadores new, delete, new[] (arrays) e delete[] (arrays). Em C, usam-se somente rotinas como malloc(), ..., free(); 3. Além de ponteiros, C++ possui referências; 4. Em C, deve-se usar a palavra-chave "struct" para declarar um objeto com tipo de alguma struct. Exemplo: struct qualquer { int um; int dois; }; qualquer registro; // ERRADO em C, CORRETO em C++ struct qualquer registro; // CORRETO em C 5. C possui arrays de tamanho variável (variable length arrays); 6. C possui compound-literals (objetos equivalentes a structs, mas que não precisam de identificadores); 7. C possui o qualificador restrict (útil para programação envolvendo hardware); 8. C possui o tipo de dado long long int; 9. C++ não permite que instruções goto alterem o fluxo de execução de modo que ele pule uma inicialização; 10. C++ não restringe o tipo de valores de um enum. Em C, todos os elementos da sequência têm tipo int. 11. Em C, uma função que não especifica parâmetros é diferente de uma função que especifica 'void'. Portanto, int funcao1(); int funcao2(void); funcao1 pode ser chamada com qualquer número e tipo de argumentos, incluindo 0, e funcao2 só pode ser chamada sem argumentos. Em C++, ambas as formas são equivalentes e não é permitido chamar nenhuma das duas com mais que 0 argumentos. 12. C possui variadic macros (macros que aceitam número variável de argumentos). 13. C++ implementa strings, que não existem em C. A lista continua. Algumas observações adicionais são pertinentes: em C++, ao contrário do que a inferência nos levaria a crer, ao declarar uma struct que possui como membros objetos de tipo "ponteiro para" [a própria struct], deve-se usar a palavra-chave "struct" (como fazemos, normalmente, em C). Ou seja, em C++: struct registro { string nome; int codigo; }; registro novo; // CORRETO struct lista { int valor; //lista *proximo; // ERRADO!!!! struct lista *proximo; // CERTO }; Deve ter dado pra perceber que códigos das duas linguagens são facilmente confundíveis, a não ser que se possua bom conhecimento nelas. O principal argumento de programadores de C++ contra C é o de que a linguagem é simples (básica) demais. Programadores de C, pelo contrário, dizem que C++ é complexa demais. Diz-se, por exemplo, que o overload de operadores faz com que trechos de código dependam de contexto que se espalha indefinidamente (isto é, uma linha de código que contenha "a = b * c" pode fazer muitas coisas diferentes, e pode haver confusão ao tentar interpretá-la). Tudo isso acarreta em dificuldades de manutenção de código. Independentemente de qual linguagem é a melhor, a confusão entre as duas sempre foi grande. Conhecer uma não implica de modo algum que se conhece a outra. Um exemplo é este próprio post. Eu não sei praticamente nada sobre C++, portanto tive que pesquisar para encontrar diferenças sintáticas específicas (as enumeradas acima). C não é uma linguagem simples. Diversos aspectos da linguagem evolvem conceitos abstratos ligeiramente complexos, e interações entre tais conceitos que são ainda mais complexas. Quando perguntei por que aqui no fórum as linguagens eram colocadas em uma mesma área, a resposta que obti foi de que muita gente que se interessa por uma se interessa também pela outra. Está aqui, então, o post que esclaresce a aproximação lógica de ambas, e que tenta humildemente explicitar o quão diferentes são as duas linguagens. Compartilhar este post Link para o post Compartilhar em outros sites
Go Back 0 Denunciar post Postado Janeiro 5, 2011 Legal! Mas você falou mais de C do que de C++ (Lógicament porquê você disse que não conhece e teve que pesquisar diferenças sintáticas). Eu achei que o tópico ia mostrar vantagens e desvantagens de se usar C ou C++ e não diferença entre comandos. Compartilhar este post Link para o post Compartilhar em outros sites
guidjos 65 Denunciar post Postado Janeiro 5, 2011 Seria errado, ou, no mínimo, infrutífero que eu postasse sobre "vantagens e desvantagens de cada uma". Como eu disse, não programo em C++ e provavelmente não poderia chegar nem perto de listar quase todas as suas vantagens - eu me concentraria em suas desvantagens (motivos pelos quais eu não programo em C++). O propósito do post é, repito, explicitar a diferença entre as duas. Já vi gente dizendo "sei C, então C++ eu aprendo em 1 mês". Assim como já vi gente dizendo "sei C++, então sei C". Todas as pessoas que já vi dizendo isso cometeram erros fundamentais ao tentarem programar em C, o que mostra que a linguagem não é, exatamente, um sobreconjunto do C (como muitos a "pintam"). Compartilhar este post Link para o post Compartilhar em outros sites
Renato Utsch 24 Denunciar post Postado Janeiro 21, 2011 Dei uma olhada aí, vou dar uma complementada com relação a C++ e uma organizada, separando as 2: Vantagens da C em relação à C++ 1. C usa ponteiros para void para manipular dados de tipo desconhecido. Para isso, programadores podem atribuir valores de ponteiros para void a ponteiros para outros tipos, sem problema algum (e sem necessidade de casting). malloc(), realloc(), calloc() e free() são exemplos de funções que utilizam void * e que possibilitam que se trabalhe com ponteiros para quaisquer tipos de dados. Em C++, isso não é permitido. Portanto, o seguinte código, que é completamente correto (e até recomendado) em C, não é correto em C++: char *a = malloc(30); // malloc() retorna void *, que, aqui, é corretamente atribuído a "a" sem necessidade de cast 2. Em C, deve-se usar a palavra-chave "struct" para declarar um objeto com tipo de alguma struct. Exemplo: struct qualquer { int um; int dois; }; qualquer registro; // ERRADO em C, CORRETO em C++ struct qualquer registro; // CORRETO em C 3. C possui arrays de tamanho variável (variable length arrays); 4. C possui compound-literals (objetos equivalentes a structs, mas que não precisam de identificadorse); 5. C possui o qualificador restrict (útil para programação envolvendo hardware); 6. C possui o tipo de dado long long int; 7. Em C, uma função que não especifica parâmetros é diferente de uma função que especifica 'void'. Portanto, int funcao1(); int funcao2(void); funcao1 pode ser chamada com qualquer número e tipo de argumentos, incluindo 0, e funcao2 só pode ser chamada sem argumentos. Em C++, ambas as formas são equivalentes e não é permitido chamar nenhuma das duas com mais que 0 argumentos. 8. C possui variadic macros (macros que aceitam número variável de argumentos). Vantagens da C++ em relação à C 1. A C++ possui Programação Orientada a Objetos (POO, ou Object Oriented Programming - OOP em inglês), que permite gerenciar muito mais facilmente grandes e médios programas, ainda mantendo a legibilidade e a facilidade de entendimento. 2. A C++ Possui Classes, que são provenientes da Programação Orientada a Objetos. 3. A C++ Possui Templates (tipos genéricos), o que permite a reutilização do código e facilita muito algumas tarefas em programação. 4. A C++ dá suporte a overload de operadores, algo muito útil e que permite criar seus próprios tipos de dado, mudando o que cada operador faz com cada tipo criado. 5. C++ possui os operadores new, delete, new[] (arrays) e delete[] (arrays). Em C, usa-se somente rotinas como malloc(), ..., free(), que podem gerar muitos problemas em alocação dinâmica de memória, o que não existe em C++. 6. Além de ponteiros, C++ possui referências permitindo chamadas por referências a funções. 7. A C++ também dá suporte a struct de dados, e ainda permite que código, não só dados, sejam adicionados à struct, o que a torna uma classe pública por padrão que funcionaria para complementar uma struct de dados, e ainda permite que struct só de dados sejam utilizadas. 8. A C++ não permite que instruções goto alterem o fluxo de execução de modo que ele pule uma inicialização, evitando que o código se desestruture por causa da instrução goto (a famosa instrução gera-macarrão) 9. C++ não restringe o tipo de valores de uma enum. Em C, todos os elementos da sequência têm tipo int. Isso permite que uma enum seja mais flexível. 10. Em C++, uma função que não especifica parâmetros é igual a uma função que especifica 'void' (o que não ocorre na C). Isso é até uma ligação mais lógica, visto que caso exista uma função 1, sem nenhum parâmetro, é óbvio que existe o vazio (void) entre as 2 chaves ( e ), o que permite que isso seja explicitado. int func1(); int func2(void); Essas 2 funções só diferem no nome, já que ambas são do mesmo tipo (int) e possuem o 'vazio' entre suas chaves ( e ). 11. A C++ implementa strings, que não existem em C. 12. A C++ possui namespaces, o que impede que haja conflitos de nome entre a biblioteca padrão, seu programa e programas de terceiros. 13. A C++ possui o qualificador const, o que faz com que não seja necessário o uso de macros (#define MACRO 0 é um macro, por exemplo), desfazendo a bagunça entre o código e o pré-processador, que são incompatíveis. Ainda assim o uso de macros para compilação condicional e todo o suporte a macros em si pode ser usado, como em C. É claro que a lista das 2 continua. Abraços :D Compartilhar este post Link para o post Compartilhar em outros sites
quitZAUMMM 18 Denunciar post Postado Janeiro 21, 2011 Pô legal não sabia dessa que o guidjos falou que ta no item 11. isso ai galera vamos movimentar idéias.. Sobre o tópico vo ser sincero também que eu nunca tentei ir afundo para descobrir se uma é derivada da outra e se não é pq.. Eu pensava da seguinte forma como ele descreveu no segundo post: O propósito do post é, repito, explicitar a diferença entre as duas. Já vi gente dizendo "sei C, então C++ eu aprendo em 1 mês". Assim como já vi gente dizendo "sei C++, então sei C". Todas as pessoas que já vi dizendo isso cometeram erros fundamentais ao tentarem programar em C, o que mostra que a linguagem não é, exatamente, um sobreconjunto do C (como muitos a "pintam"). Galera estamos analisando uma possível mudança no nosso fórum de "C/C++", que seria "dividir" essas duas áreas.. oq vcs acham? []s Compartilhar este post Link para o post Compartilhar em outros sites
Renato Utsch 24 Denunciar post Postado Janeiro 21, 2011 Eu concordo nos 2 aspetos que você disse, quit... as 2 linguagens são diferentes, e até há uma rixa entre os programadores (exclusivos de cada) das duas linguagens. Embora as 2 sejam compatíveis em alguns pontos, em outros são como Java e Assembly. A C tem alguns pontos a mais que a C++ e a C++ tem alguns (vários) pontos a mais que a C (dá pra ver que sou do lado da C++ né? kkk)... Abraços :D Compartilhar este post Link para o post Compartilhar em outros sites
guidjos 65 Denunciar post Postado Janeiro 21, 2011 É por isso que não podemos citar vantagens e desvantagens. Eu considero o overload de operadores perigoso, e, portanto, desvantajoso. Templates, que podem ser usados para aumentar modularidade e reusabilidade, podem também, com facilidade, gerar códigos incompreensíveis (isso acontece frequentemente: programadores criam templates absurdamente complexos para resolver um problema que, caso fosse abordado de outra forma, apresentaria soluções simples). Obviamente, cada um acha a sua linguagem melhor. Se eu "concordasse" com as vantagens de C++, eu a usaria ao invés de C. C++ proíbe atribuição de ponteiros de tipo diferente sem cast porque considera a prática como insegura. Eu acho que isso não é problema, e facilita a manutenção de um código limpo e organizado (aliás, em C, é recomendado não fazer casting nestes casos). É por isso que eu disse que é errado tentar listar as vantagens e desvantagens de forma neutra. Isso não existe. E se não for pra fazer isso, vamos entrar numa "guerra de linguagens", que é, por princípio, ridícula. É como discutir qual cor é mais bonita. Compartilhar este post Link para o post Compartilhar em outros sites
Renato Utsch 24 Denunciar post Postado Janeiro 21, 2011 Ah, isso com certeza. Eu acho que deveríamos mudar esse tópico, com a intenção de mostrar aos novatos qual a finalidade de cada, e sugerir a mais recomendada para cada tipo de tarefa. Abraços :D Compartilhar este post Link para o post Compartilhar em outros sites
quitZAUMMM 18 Denunciar post Postado Janeiro 22, 2011 Galera então sobre a mudança.. A idéia está assim: O nome do fórum ao invés de "C/C++" ia ser chamado de "Linguagem C" e nele iria se criar um sub-fórum com o nome de "C++".. galera vamos opinar, pois a idéia é do guidjos e não quero que caia no esquecimento.. []s Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Janeiro 22, 2011 só vi o tópico agora :P acho uma boa ideia dividir. Fica mais organizado e é melhor até para os iniciantes, que geralmente começam com C puro Compartilhar este post Link para o post Compartilhar em outros sites
Renato Utsch 24 Denunciar post Postado Janeiro 22, 2011 Mas eu acho que fica mais organizado ficar tipo a seção principal C/C++ com 2 sub-fóruns: o sub-fórum C e o sub-fórum C++... Fica mais organizado assim... Aí na seção raíz não dá pra postar nada, como na de Remoção de Malwares ou na de avaliação de Sites, Logotipos, etc Abraços :D Compartilhar este post Link para o post Compartilhar em outros sites
guidjos 65 Denunciar post Postado Janeiro 22, 2011 Só pra esclarecer: eu dei a sugestão pra equipe de administração, e a decisão final cabe a eles. No tópico em que dei a ideia, pediram pra que eu criasse este tópico aqui que serviria pra eliminar confusões e tornar explícita a diferença entre as duas linguagens. Compartilhar este post Link para o post Compartilhar em outros sites
Sebastiao Marcos 3 Denunciar post Postado Outubro 5, 2011 de certo modo, achei ótimo o topico a um tempo atras eu dizia muito bem "Sei C++ sei C" o tempo por ser Autoditata e nunca tive e nem tenho um professor percebi que não erá bem assim, você erá para ter postado também sobre prototipos. No caso do C a função ter de ser feitas antes de seu uso, e no C++ praticamente não. quanto a idéia de dividir, acho que não ficaria legal, logo que C/C++ é um forma que já vem se carregando a anos e mesmo assim muitas coisas que você não vê ou não percebeu no C++ perceberá no C. e vice-versa. Compartilhar este post Link para o post Compartilhar em outros sites
Renato Utsch 24 Denunciar post Postado Outubro 6, 2011 Olá! Na C++ sim, também sempre tem que definir o protótipo das funções, só que como os protótipos estão nas classes, parece que não precisa... Sim, ficar junto não dá muito certo por causa disso mesmo que você falou. Abraços :D Compartilhar este post Link para o post Compartilhar em outros sites
Mainfield 0 Denunciar post Postado Janeiro 12, 2012 Muito bom. Só precisa completar mais. Compartilhar este post Link para o post Compartilhar em outros sites
Honiesty 0 Denunciar post Postado Fevereiro 3, 2012 Olá, sou novato em programação, sou fluente somente em DarkBasic, pretendo me especializar na programação de jogos digitais, portanto estou pesquisando diversos tipos de linguagens utilizadas em jogos, e este tópico esclareceu muitas dúvidas ^^, obrigado e parabéns, bem explicativo e bem organizado. Só pra constar, eu sou a favor de separar as 2 linguagens '-' Compartilhar este post Link para o post Compartilhar em outros sites