C e C++: Histórias, Diferenças e Incompatibilidades

C: Origens e Características

A linguagem C recebeu esse nome por ser descendente da linguagem B, criada por Ken Thompson, que por sua vez originou-se da linguagem BCPL.

Em 1967, Martin Richards, da Universidade de Cambridge, simplificou a linguagem CPL, resultando na criação da linguagem BCPL (Basic Combined Programming Language). Ele utilizou a linguagem B para desenvolver o primeiro sistema operacional UNIX.

Em 1972, Dennis Ritchie, dos Laboratórios Bell da América, projetou uma nova linguagem baseada na B, inspirando-se na segunda letra de BCPL para nomeá-la como C.

A linguagem C é extremamente concisa, contendo apenas 32 palavras-chave, 9 instruções de controle e 34 operadores.

Especificamente, C é uma linguagem estruturada, com foco na implementação de estruturas de dados e algoritmos. O design de um programa C prioriza como processar entradas (ou condições ambientais) através de procedimentos para obter saídas (ou controlar processos).

Embora C possa ser utilizada para qualquer finalidade, seu uso mais proeminente é na escrita de sistemas operacionais e compiladores.

C é altamente eficiente, frequentemente exigindo consideração sobre gerenciamento de memória e outros aspectos de baixo nível. Infelizmente, esses aspectos exigem considerável tempo de desenvolvimento. Como linguagem de programação de baixo nível, C permite gerenciamento direto de memória através de ponteiros. Além disso, muitas outras linguagens foram desenvolvidas utilizando C, como Perl, Java e Python.

C é uma linguagem de programação versátil que combina características de linguagens de alto nível com características de linguagem assembly. Após 1978, C foi portada para computadores de grande, médio, pequeno e microescalas. Ela pode ser usada como linguagem de design de sistemas, aplicativos de sistema, ou como linguagem de design de aplicativos, programas independentes do hardware. Seu escopo de aplicação é amplo, com forte capacidade de processamento de dados, não apenas em desenvolvimento de software, mas também em diversas áreas de pesquisa. É adequada para desenvolvimento de sistemas, gráficos 2D e 3D, animações, e aplicações específicas como desenvolvimento de microcontroladores e sistemas embarcados. Embora C tenha sido projetada para software de sistema operacional, também é amplamente utilizada no desenvolvimento de software portável.

Código:

#include <stdio.h>

int principal() {
    printf("Olá, universo!n");
    return 0;
}

C++: Evolução e Capacidades

Na metade da década de 1970, Bjarne Stroustrup trabalhava no Centro de Computação da Universidade de Cambridge. Ele havia utilizado Simula e ALGOL, e tinha experiência com C. Profundamente impressionado com o sistema de classes do Simula e com a estrutura do ALGOL, e compreendendo a importância da eficiência de execução, seu objetivo era criar uma linguagem que fosse simples de programar, correta e confiável, ao mesmo tempo que eficiente e portável. Com base em C e inspirado nos conceitos do Simula, ele encontrou a solução ideal para suas necessidades. Em 1979, Bjame Stroustrup ingressou nos Laboratórios Bell e começou a trabalhar na melhoria de C, resultando em "C com classes" (C with classes). Em 1983, essa linguagem foi oficialmente nomeada como C++.

Assim, C++ é a continuidade e evolução de C. C++ é poderosa, adequada para o desenvolvimento de grandes aplicativos. Ela suporta tanto programação orientada a objetos quanto compatibilidade com C, permitindo também programação procedural.

C++ é uma linguagem complexa e desafiadora, não apenas em termos de sintaxe, mas especialmente por oferecer quatro modelos de pensamento de programação: procedural, baseado em objetos, orientado a objetos e paradigma genérico. Portanto, C++ é ao mesmo tempo eficiente e flexível; suporta tanto orientação a objetos quanto compatibilidade com programação procedural.

Na comunidade de programadores da China continental, C++ é frequentemente pronunciada como "C mais mais", enquanto programadores ocidentais geralmente a chamam de "C plus plus" ou "CPP". É uma linguagem de programação de computador amplamente utilizada. C++ é uma linguagem de programação genérica com verificação estática de tipos de dados, suportando múltiplos paradigmas de programação. Ela suporta programação procedural, abstração de dados, programação orientada a objetos e programação genérica entre outros estilos de design de programas.

C++ é uma das linguagens de programação mais populares, com aplicações abrangendo software de sistema, aplicativos, drivers, software embarcado, aplicativos de servidor e cliente de alto desempenho, e software de entretenimento como jogos eletrônicos.

Código:

#include <iostream>

namespace meuEspaco {
    void imprimirMensagem() {
        std::cout << "Olá, mundo!" << std::endl;
    }
}

int principal() {
    meuEspaco::imprimirMensagem();
    return 0;
}

Diferenças entre C e C++

Abordagem procedural: Analisa os passos necessários para resolver um problema e implementa esses passos sequencialmente através de funções.

Abordagem orientada a objetos: Decompose os elementos do problema em objetos. O objetivo de criar objetos não é executar passos sequenciais, mas sim descrever o comportamento de cada elemento durante a resolução do problema.

Das descrições acima, pode-se inferir que a programação orientada a objetos e procedural são duas maneiras distintas de pensar sobre e resolver problemas, com a principal diferença sendo o ângulo de abordagem.

A linguagem C é uma linguagem de programação procedural, onde sua característica mais importante é a função, com a função main chamando várias sub-funções. A ordem de execução do programa é determinada previamente pelo programador.

C++ é uma linguagem de programação orientada a objetos, onde classes são sua principal característica. Durante a execução do programa, a execução começa na função main, onde algumas classes são definidas, e as funções membro dessas classes são executadas conforme necessário. O conceito de procedimento é atenuado (na verdade, os procedimentos ainda existem, representados pelas instruções na função principal), e o programa é executado impulsionado por classes. Classes são objetos, por isso denominamos essa abordagem de programação orientada a objetos. Ao analisar e resolver problemas usando orientação a objetos, os dados e as operações neles contidos são encapsulados em classes. Através das classes, objetos podem ser criados, e eses objetos são acionados por eventos ou mensagens para executar processos.

A principal diferença entre C e C++ está na metodologia de resolução de problemas. C é principalmente utilizado em áreas embarcadas, desenvolvimento de drivers e outras áreas que interagem diretamente com o hardware. C++ pode ser utilizado no desenvolvimento de camadas de aplicação, interfaces de usuário e outras áreas que interindiretamente com sistemas operacionais.

C++ não apenas herdou as poderosas características de operação de baixo nível de C, mas também foi dotada de mecanismos orientados a objetos de padrão acadêmico. Ela possui inúmeras características, incluindo herança múltipla, rara em outras linguagens orientadas a objetos, e uma distinção aprofundada entre passagem por valor e passagem por referência, além da palavra-chave const. C++ é como uma canivete suíço ou uma caixa de ferramentas, fornecendo o máximo possível de ferramentas, tantas que podem deixar os iniciantes desorientados, enquanto aqueles que sabem usá-la se sentem como peixes na água. As diversas características de C++ a tornam extremamente adequada para o desenvolvimento de estruturas de dados de baixo nível, algoritmos, bibliotecas, etc., sendo um arsenal poderoso para desenvolvimento de sistemas e construção de modelos matemáticos, sendo aclamada como linguagem de programação de nível industrial.

Os "aumentos" do C++ em relação a C manifestam-se nos seguintes aspectos:

Verificação de tipos mais rigorosa. Adição de mecanismos orientados a objetos. Adição de mecanismos de programação genérica (Template). Adição de tratamento de exceções. Adição de sobrecarga de operadores. Adição da Biblioteca de Modelos Padrão (STL). Adição de namespaces, para evitar conflitos de nomenclatura global.

Incompatibilidades entre C++ e C

A maior parte do código C pode ser compilada com C++, mas o código C++ geralmente não é compatível com C (embora seja "maioria" e não "total"). Embora C++ seja um superconjunto de C, existem áreas onde C++ não é compatível com a linguagem C.

4.1 Posição da declaração de variáveis

Em C, as declarações de variáveis e o código estão separados, devendo ser declaradas no início da função;

Em C++, as variáveis podem ser declaradas em qualquer lugar, desde que seja garantido que sejam declaradas antes de serem usadas.

4.2 Estruturas struct

Ao usar struct para definir variáveis:

struct minhaEstrutura { int i; float x; };

Em C, a declaração de variáveis struct deve ser assim: struct minhaEstrutura a;

Em C++, o prefixo struct não é necessário: minhaEstrutura a;

Uma forma compatível é:

typedef struct _minhaEstrutura { int i; float x; } minhaEstrutura;

E então usar minhaEstrutura para definir variáveis. O mesmo se aplica a tipos de enumeração (enum) e tipos de união (union).

Em C++, struct suporta a definição de funções membro, algo não possível em C. É importante notar que em C++, o especificador de acesso padrão para funções membro é public, diferente das classes, cujo especificador de acesso padrão é private.

4.3 Tipo booleano

C++ possui tipo bool (ou boolean); C não possui tal tipo booleano, todos são tipos numéricos! É importante notar que verdadeiro é representado por não zero (como: 1, 52, -5, -2, etc.) e falso por 0.

4.4 Diferenças em comentários

Em C, há apenas um tipo de comentário: /....../;

Em C++, os comentários incluem ambos /....../ e //.

4.5 Conversão de tipo forçada

Em C, a forma de conversão forçada é: (tipo)variável;

Em C++, também pode ser usada: tipo(variável).

4.6 Atribuição

Na linguagem C, há apenas um operador de atribuição: =;

Em C++, além de =, também pode ser usado (). Por exemplo: int x(5); é equivalente a: int x=5; Acredita-se que essa notação foi introduzida para inicialização de atributos que são objetos em C++, mas também pode ser usada com tipos básicos.

4.7 Funções

Em C, as funções não possuem valores de parâmetros padrão. Em C++, as funções podem ter conceito de valores de parâmetro padrão, note a diferença entre parâmetros padrão e sobrecarga de função.

Em C, a definição de função tem duas formas: clássica e padrão. Em C++, apenas a forma padrão é suportada.

Forma padrão: int string(int x, float y){......}

Forma clássica: int string(x, y) int x; float y; {......}

Em C++, as funções devem ter seu protótipo ou definição declarados antes de serem usados, pois C++ é uma linguagem de tipagem forte. Em C, é permitido chamar funções antes de suas declarações e definições.

4.8 Operador & e palavra-chave const

O operador & tem o significado básico de endereçamento, ambos C e C++ suportam essa sintaxe. Mas em C++, & também pode representar referência. Com o conceito de referência, chamadas de função podem ser usadas como l-values. Por exemplo:

int &referencia()......referencia()=5;

A expressão acima é totalmente válida em C++, mas ilegal em C.

A palavra-chave const tem uma diferença importante: em funções de classe C++, a função pode ser declarada como const, indicando que a função não altera nenhum atributo da classe. Por exemplo: void inalteravel() const; C não permite tal declaração.

4.9 Especificador extern

Em algumas versões de C, é possível usar múltiplas vezes uma variável global em um programa sem usar o especificador extern. Em C++, exceto na definição de variáveis globais, seu uso em outros módulos deve primeiro ser declarado com extern.

4.10 Ponteiros void

Em C, ponteiros void podem ser atribuídos a ponteiros de qualquer tipo, mas em C++ isso não é possível. Eles devem primeiro ser convertidos por type casting antes da atribuição.

Tags: C C++ linguagens de programação programação procedural Orientação a Objetos

Publicado em 7-10 03:59