Introdução

Introdução

Como prometido, começando com esta parte do nosso artigo de desenvolvimento C, começaremos a aprender, sem mais introdução. Não consegui encontrar uma maneira melhor de começar além disso, porque tipos, operadores e variáveis ​​são uma parte essencial de C e você os usará o tempo todo ao escrever seus próprios programas. Por exemplo, você pode escrever um programa C simples sem definir suas próprias funções, mas é mais difícil fazer isso sem algumas variáveis, a menos que você queira manter “olá, mundo!”. Uma variável nada mais é do que um local na memória, mantendo um valor que pode ser alterado (daí o nome). Mas antes de declarar uma variável, você deve saber que tipo de valor deseja que ele segure, e aqui você usará os tipos. E para operar Nessas variáveis, você precisará de ... operadores, é claro. Pretendo tornar este curso o mais conciso possível, por isso recomendo atenção e, como de costume, pratique.

Tipos

Como dito, antes de ir e declarar uma variável, você deve saber que tipo de valor ele manterá. Será um número? Nesse caso, quão grande poderia ser? É um número inteiro? Ou talvez você queira declarar uma corda? Essas são coisas que você deve saber com certeza antes de escolher o tipo, e recomendamos cuidados extras quando se trata de possíveis transbordamentos de buffer. C é o tipo de linguagem que lhe dá corda suficiente para se enforcar e não faz muita manutenção, e esses erros são muito difíceis de identificar em um grande programa.

Antes de começarmos, você deve estar ciente dos relacionamentos entre hardware e tipos. É aqui que esperamos que você faça alguma leitura, especialmente se estiver usando hardware diferente do X86, seja de 32 ou 64 bits, compiladores que não sejam GCC ou sistemas operacionais que não sejam Linux. Geralmente, essas diferenças aparecem ao lidar com valores de ponto flutuante. Não vamos nos aprofundar nisso, pois não é a hora nem o local, mas você deve ler alguma documentação sobre seu compilador, especialmente peças dependentes de hardware. Agora vamos começar.

char c; char não assinado uc; shorts; curto não assinado; int i; u não assinado; Long L; Ul longo não assinado; flutuar f; duplo d; longo LD duplo; const int ci; 

Decidimos seguir o caminho de "Exemplo primeiro, explicações mais tarde" aqui, porque sentimos que alguns de vocês encontrarão o exemplo acima familiar familiares. Existem outros idiomas relacionados que declaram suas variáveis ​​quase da mesma maneira e, afinal, as palavras -chave são intuitivas. Antes de continuarmos, deve -se dizer que char, int, flutuar e duplo são os principais tipos de dados em c. Não assinado e assinado são modificadores, o que significa que, se você precisar trabalhar com valores menores que zero, deve dizer ao compilador que sua variável é assinada, pois pode ser maior ou menor que o zero. Longo e curto (geralmente são aplicáveis ​​aos números inteiros) permitem armazenar valores maiores, ou menores, e o número de bytes depende da máquina, mas um curto deve ser sempre menor que um int, que por sua vez deve ser sempre menor do que junto. Como você pode ver, na prática, não usa int ou curto int ou curto, apenas longo ou curto. A palavra -chave const diz ao compilador que uma vez que uma variável tem um valor, ela não pode ser alterada.

Vamos começar com o menor tipo, char. É garantido que seja grande o suficiente para manter o valor de um byte, e é sempre o tamanho fixo. Se as pessoas lhe dirão que um byte é sempre oito bits, é melhor pensar novamente. Toda arquitetura popular de hardware realmente usa bytes de oito bits, mas há exceções; portanto, não faça suposições se quiser escrever código portátil. No x86, como um byte é de oito bits, um char (não assinado) pode conter valores de 0 a 255, ou seja, 28. Se um char for assinado, poderá conter valores de -128 a 127. Mas o nome pode enganá -lo: um personagem pode realmente ser armazenado em um char, mas se você estiver usando o Unicode, estamos falando de multibyte lá e você terá que usar wchar_t, mas mais sobre isso mais tarde.

Agora que você sabe que tipo de modificadores são, podemos chegar aos números inteiros. Nos números inteiros, você pode combinar os modificadores de sinal e comprimento, como visto no exemplo acima, para atender às suas necessidades. Lembre -se de ter um editor útil e verifique com os limites.h cabeçalho (no meu sistema, ele pode ser encontrado em /usr /incluir) para descobrir os limites reais do seu sistema. Como regra curta, um int reportará valores de 0 a 65535 ou, se assinado, de -32768 a 32767. E um modificador longo dobrará o número de bytes de armazenamento; portanto, se um int exigir 2 bytes, um longo exigirá 4. Vamos deixar para o usuário descobrir o restante dos números inteiros e seus valores mínimos e máximos. No entanto, mostraremos como descobrir tamanhos e limites em seu sistema.

Os carros alegóricos são valores de ponto flutuante, o que implica que você deve definir uma variável como esta:

valor flutuante; valor = 234.00;

Mesmo que não tenha nada depois do ponto (a parte decimal), então é um número inteiro realmente. Na verdade, existem situações em que você deve declarar um valor inteiro como um bóia, porque o valor pode mudar e o tipo declarado deve ser capaz de armazenar valores de ponto flutuante. Todos os valores em sua máquina podem ser encontrados em flutuação.h.

Variáveis

Agora que você sabe que tipos você tem disponível em C, vamos ver como você pode usá -los efetivamente. Alguns podem se perguntar: “Se temos duplas por muito tempo que podem armazenar valores tão grandes, por que não usá -los em todos os lugares?” . A programação é sobre eficiência, e a programação C, especialmente, e é por isso que armazenar um valor como 23 em um dobro usará 4 vezes a memória necessária, para nada. Quando você declara uma variável, um pedaço de memória é reservado para ela, dependendo do tipo. Então, por que desperdiçar memória sem um bom motivo? Crie o hábito de usar o tipo exato que se encaixa nos seus (possíveis) valores, não menos, não mais. Você viu acima como declarar variáveis. Agora vamos ver como defini -los, como vamos dar um valor a eles.

c = 'a'; i = 234; f = 12643.984; LD = 16546581654161598309.87;

Tomamos os nomes dos exemplos anteriores, que, como você deve ter notado, são escritos para refletir o tipo atribuído, portanto 'LD' é um longo duplo e assim por diante. Neste exemplo, demos dois passos: o primeiro a declarar a variável, a segunda para defini -la atribuindo -lhe um valor. Alguns dirão que é um bom estilo escrever código como esse, mas você pode fazer as duas operações em uma etapa e ninguém o machucará:

char c = 'a'; int i = 234; Float f = 12643.984; LD LD LD = 16546581654161598309.87;

Recomendamos e até exorto você a usar nomes com um significado em seu código e comente o máximo possível: as chances de haver outras pessoas lendo o que você escreveu e a vida deles será muito mais fácil se você o fizer. Além disso, use o CAPS somente quando necessário, especialmente porque C usa todas as camadas em várias diretivas de pré-processador. Além disso, o primeiro caractere no nome da variável deve ser uma letra.

Como prometido, como toda conversa e sem reprodução não é boa, mostraremos um pequeno programa que você pode usar para ver os valores mínimos e máximos de vários tipos, mas apenas ilustraremos alguns. O resto será seu trabalho a fazer, seguindo nosso exemplo, com um editor tendo limites.h e flutuem.h aberto. Haverá alguns novos elementos aqui, mas nunca se preocuparão, eles serão explicados.

#include #include #include int main () não assinado long ullmax = ullong_max; Lmax longo = long_max; LDMAX DUPLO LONGO = LDBL_MAX; printf ("O valor máximo de um longo tempo não assinado é %lu.\ n ", ullmax); printf (" o valor máximo de um longo é %ld.\ n ", lmax); printf (" O valor máximo de um duplo longo é %lf.\ n ", ldmax); retornar 0;  

Então, declaramos três variáveis ​​com nomes significativos e atribuímos a eles os valores de três macros definidas nos limites.h e flutue.h. Então, é claro, teremos que imprimi -los. Fazemos isso usando printf (), e aqui vamos parar para uma pequena conversa. Recomendamos 'Man 3 Printf' para obter mais detalhes sobre Formato Strings, isto é, a parte dentro das citações duplas do printf que começa com um '%'. Eles dizem a printf que tipo de valor ele deve esperar, por isso deve se comportar de maneira diferente com diferentes tipos. No primeiro exemplo, '%lu' significa longo longo (o l), que não é assinado (o 'u'). Para os números inteiros, a sequência do formato é 'd', para decimal e porque é um número inteiro longo, será '%ld'. No terceiro printf, f significa flutuar, um duplo é basicamente um bóia longa e um duplo longo é um bóia longa e longa, daí o formato.

Agora, salve o código acima, compile -o e execute -o. Este programa, depois de adicionar mais a ele, ajudará você quando quiser declarar uma variável, mas você ainda não tem certeza em que tipo ele deve se encaixar.

Operadores

Operadores aritméticos

Este subcapítulo, é claro, lida com os operadores básicos usuais que você aprendeu na escola primária. Mas há um pouco mais. Exemplo de inimigo,. Os operadores +, -, *, / e % são os operadores binários. % é o operador do módulo, o que significa que, se tivermos 50 % 2, o resultado será 0 porque o resultado da divisão 50 /2 tem um número inteiro como resultado. Você pode usar os quatro primeiros operadores com qualquer valor numérico, mas o Modulo lida apenas com inteiros. Precedência é a mesma que no livro de aritmética.

Operadores relacionais

Esses operadores são>,> =, <=, <, and they all have the same precedence. For the next part we recommend extra care, because it's cause for much confusion in the beginner's league, and non-beginners alike. Like said above, one uses '=' to give some value to a variable. But if you want to check if a variable has a certain value, you use '==', and if it hasn't, use '!=', where '!' is the logical negation operator, as you'll see. Let's take the following (useless) example:

#include int main () int var = 4; se (var == 4) printf ("var é 4!\ n "); outro printf ("Há algo errado.\ n "); retornar 0;  

Elenco

Em poucas palavras, o elenco está forçando o compilador a esquecer o tipo de uma variável e tratar como tendo outro tipo que você fornece. Isso não é feito aleatoriamente, apenas entre tipos compatíveis, e os cuidados são recomendados ao usar a fundição. Por exemplo, digamos que queremos descobrir o valor ASCII de 'a'. O código pode ficar assim:

#include int main () char c = 'a'; printf ("O valor ASCII de 'A' é %D.\ n ", (int) c); retornar 0;  

Você receberá o valor 97, que é realmente o valor ASCII de 'A'. Então, usando parênteses antes e depois do tipo que você deseja "impor" e tudo isso antes do nome da variável, você é fundido. O exemplo acima funciona porque um char nada mais é do que um pequeno int, então os tipos são compatíveis. Tente lançar a variável acima para outros tipos e observe os resultados.

Operadores de incremento e decréscimo

Você já ouviu falar sobre C ++ com certeza. Bem, seu nome sugere que é de alguma forma mais que C, porque '++' é um operador de incremento (adiciona 1 ao valor da variável), assim como '-' é um operador de decréscimo. Estes são operadores unários e podem ser prefixados e pós -fixados. O que isso significa? Isso significa que você pode escrever ++ C ou C ++, e o resultado pode ou não ser semelhante. A diferença é que, com '++' prefixado, o valor da variável é primeiro incrementado por um, depois usado e o contrário. Mostraremos um pequeno exemplo de quando isso importa e quando não.

#include int main () int x; int n = 10; int z; n ++; / * n será 11 agora */ ++n; / *idem, prefixo ou postfix sem importância */ x = n ++; / * x será 10 */ z = ++ n; / * Z será 11 */ retornar 0;  

Mas e se você quiser incrementar/decrescer com mais de um? Simples, já que C ++ é o equivalente a C+= 1. Substitua 1 por qualquer valor necessário e você está definido. Esses operadores compostos também podem ser usados ​​com outros operadores aritméticos binários (e.g. *= ou /=) e os operadores bit -newwise também, como 'a & = b'.

Operadores bitwise

Em C, você pode fazer operações bit -bois facilmente, mas lembre -se! Eles funcionam e devem ser usados ​​apenas com tipos inteiros, assinados ou não assinados. Esses operadores são:

& - Bitwise e | - Bitwise ou ^ - Xor <> - Mudança direita - - um complemento

Operadores lógicos

Nós já lidamos com '!', que nega qualquer expressão lógica, mas existem dois operadores lógicos muito importantes (tenha cuidado para não misturá -los com os bit neles): e ou, respectivamente. Então, se eu quiser escrever em C algo como “Se a variável 1 tiver o valor 2 e a variável 2 tem valor 8”, escreverei assim:

se (var1 == 2 && var2 == 8)… 

Aqui ambas as condições devem avaliar como verdadeiras para as instruções seguintes se forem executadas. Se qualquer um deles, ou ambos, substituímos '&&' por '||' (conjunção versus disjunção).

Outros operadores

As pessoas que têm alguma experiência em C podem ter notado a falta de alguns operadores. Claro, e estamos cientes disso, mas que sentido faria para listar o operador de indireção, enquanto os leitores não sabem o que é um ponteiro? Portanto, os outros operadores, específicos para outras partes de C, serão tratados no devido tempo.

Conclusão

Com os exemplos oferecidos nesta parte, temos certeza de que você tem o suficiente para jogar um pouco e tentar várias opções. Você sabe, o compilador não morde se você alimentar dados errados, nem o computador explodirá. E, como dissemos antes, você não pode aprender apenas a programação lendo livros. Então pegue seu teclado e crie algo interessante.

Aqui está o que você pode esperar a seguir:

  • EU. C Desenvolvimento no Linux - Introdução
  • Ii. Comparação entre C e outras linguagens de programação
  • Iii. Tipos, operadores, variáveis
  • 4. Controle de fluxo
  • V. Funções
  • Vi. Ponteiros e matrizes
  • Vii. Estruturas
  • Viii. E/S básico
  • Ix. Estilo de codificação e recomendações
  • X. Construindo um programa
  • XI. Embalagem para Debian e Fedora
  • Xii. Obtendo um pacote nos repositórios oficiais do Debian

Tutoriais do Linux relacionados:

  • Expressões regulares do Python com exemplos
  • Script Bash: Hello World Exemplo
  • Como instalar o Ubuntu no USB Stick
  • Coisas para instalar no Ubuntu 20.04
  • Uma introdução à automação, ferramentas e técnicas do Linux
  • Crie Manjaro Linux inicializável USB
  • Coisas para fazer depois de instalar o Ubuntu 20.04 fossa focal linux
  • Ubuntu 20.04 truques e coisas que você pode não saber
  • Crie um ubuntu inicializável 20.04 USB Stick no MS Windows 10
  • Como instalar os drivers da NVIDIA no Fedora 32