Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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.Carregando comentários...