Programar em C/Variáveis: diferenças entre revisões

[edição verificada][edição verificada]
Conteúdo apagado Conteúdo adicionado
Desfeita a edição 260385 de 177.59.95.98 (Discussão): conteúdo inserido fora de contexto (a explicação é sobre o exemplo anterior); <tt> --> <code>; <source> -><syntaxhighlight>
Abacaxi (discussão | contribs)
Sem resumo de edição
Linha 46:
 
== Nomes de variáveis ==
Existem algumas restrições quanto ao nome que podemos dar a variáveis. Essas regras se aplicam também para nomear funções e estruturas.
* Os nomes de variáveis devem ser únicos no mesmo escopo: não podemos ter duas variáveis com o mesmo nome!.
* O nome pode ser igual ao de outra variável já existente em escopo superior, porém é recomendado fortemente que não se use variáveis iguais sob pena de tornar o código do programa incompreensível ou de difícil análise;
* O C, assim como muitas outras linguagens de programação, é sensível à utilização de maiúsculas e minúsculas(''case sensitive''). Portanto, o código a seguir seria válido e geraria três variáveis diferentes:
 
Linha 53 ⟶ 55:
int Nome;
 
* Em nomes de variáveis, podemos usar letras maiúsculas ou minúsculas (de A a Z, sem acentos), númerosalgarismos arábicos (0-9) e o caractere sublinhado (_), mas o primeiro caractere deve ser uma letra ou o sublinhado.
* Algumas palavras não podem ser usadas para nomes de variáveis por serem [[../Lista de palavras reservadas|palavras reservadas]] (palavras que têm significado especial na linguagem).
* O padrão C atual especifica que nomes de até 31 caracteres devem ser aceitos. Alguns compiladores podem até aceitar nomes maiores que isso, mas não considere isso uma regra e não use nomes tão longos.
 
Linha 100 ⟶ 103:
Uma observação é necessária: segundo o padrão, não existe nenhuma garantia de que uma variável <code>short int</code> é menor que uma variável <code>int</code>, nem que <code>long int</code> é maior que <code>int</code>. Apenas é garantido que <code>int</code> não é maior que <code>long</code> nem menor que <code>short</code>. De fato, nos sistemas x86 de 32 bits (ou seja, a maioria dos computadores pessoais atualmente), o tamanho de <code>int</code> é igual ao de <code>long</code>. Geralmente, <code>int</code> será o tamanho nativo do processador &mdash; ou seja, 32 bits num processador de 32 bits, 16 bits num processador de 16 bits etc.
 
==== Sinal: <code>signed</code> e <code>unsigned</code> ====
=== Converter um tipo de variável ===
Existe outro tipo de modificador, que define se o número vai ser guardado com '''sinal''' ou não. São os modificadores <code>signed</code> e <code>unsigned</code>, suportados pelos tipos inteiros apenas.
A conversão de uma variável consiste em converter o tipo de uma variável em um outro. Imagine que você esteja trabalhando com uma variável do tipo float e por alguma razão queira eliminar os números que estão depois da virgula.
 
* '''<code>signed</code>''' diz que o número deve ser guardado com sinal, ou seja, serão permitidos valores positivos e negativos. Esse é o padrão, portanto esse modificador não é muito usado.
* '''<code>unsigned</code>''' diz que o número deve ser guardado '''sem sinal'''. Com isso, o valor máximo da variável aumenta, já que não teremos mais valores negativos. Por exemplo, com uma variável <code>char</code> podemos guardar valores de -128 a 127, mas com uma variável <code>unsigned char</code> pode guardar valores de 0 a 255.
 
Para usar esses modificadores, devemos colocá-los '''antes''' do nome do tipo da variável, sendo que o modificador de sinal deve vir antes do modificador de tamanho caso ambos sejam usados. Por exemplo:
 
'''unsigned char''' c;
'''short int''' valor;
'''unsigned long int''' resultado;
 
<div style="background-color: #ddffdd; padding: 10px; margin: 20px;">'''Nota:''' Você pode abreviar <code>short int</code> e <code>long int</code> para simplesmente <code>short</code> e <code>long</code>, respectivamente.</div>
 
== Compatibilidade de dados na atribuição de valor ==
Se tentarmos colocar um valor diferente do tipo esperado da variável? Temos um problema de compatibilidade de dados:
 
* '''Caso 1''': Declaramos um int e colocamos uma letra
*:Aqui não teremos problemas. Os literais de caracteres são, nativamente, do tipo ''int''. O resultado será um inteiro que contém o valor ASCII do caractere dado.
 
* '''Caso 2''': Declaramos um int e colocamos uma string (sequência de caracteres)
*:Aqui teremos um erro de compilação, em que nos diz que não conseguimos converter "<tt>const char [5]</tt>" em "<tt>int</tt>". Perceba com isso que o compilador tem alguns sistemas de conversão ― note o caso 3.
 
* '''Caso 3''': Declaramos um int e colocamos um float
*:Neste caso, se colocarmos <tt>77.33</tt>, irá ser apenas guardado o valor <tt>77</tt>, perdendo-se a parte decimal.
 
* '''Caso 4''': ''overflow'' ― declaramos um ''short'' e colocamos um valor maior que o máximo
*:Lembre-se que o tipo ''short'' guarda valores de –32767 a 32767. Se colocarmos 32768 (e o compilador não estender esses limites), ''não'' vai acontecer nenhum erro de compilação; o que resulta é que vai ser impresso um número negativo, –32767 (ou, como é comum em vários compiladores, –32768). A lógica disto tem a ver com a maneira como o computador guarda números negativos. Mas também podemos fazer uma analogia com as horas. Imaginemos que vamos somar 6 horas com 7 horas. O resultado seria 13, mas como não existe 13 no relógio, iríamos dar a volta nas horas e chegar ao 1. Assim o resultado será 1.
 
* '''Caso 5''': ''underflow'' ― declaramos um ''short'' e colocamos um valor inferior ao mínimo possível.
*:Aqui temos exactamente a mesma lógica do caso de overflow, mas desta vez é excedido o limite inferior e não o superior.
 
* '''Caso 6:''' declaramos um <tt>unsigned int</tt> e colocamos um número negativo
*:O que acontece aqui é semelhante a um underflow. Mas o que ocorre é que o número é guardado como seria se fosse um <tt>int</tt> comum, negativo. O que muda na prática é a interpretação desse número, de acordo com o tipo de dado que lhe está atribuído. Se tentarmos lê-lo como um <tt>unsigned int</tt>, obteremos um valor positivo obtido pela mesma lógica do overflow/underflow; se o lermos como um (signed) <tt>int</tt>, obteremos o mesmo valor negativo que lhe atribuímos.
 
=== Converter um tipo de variável ===
A conversão de uma variável consiste em converter o tipo de uma variável em um outro. Imagine que você esteja trabalhando com uma variável do tipo float e por alguma razão queira eliminar os números que estão depois da virgulavírgula.
 
Esta operação pode ser realizada de duas maneiras.<br>
Linha 110 ⟶ 148:
x = 7.123;
 
'''Conversões do tipo explícita:''' Também chamada de operação '''cast''', consiste em forçar a modificaçaomodificação
do tipo de variável usando o operador cast "( )".
:Ex:
Linha 116 ⟶ 154:
y = (int)7.123;
 
Veja um exemplo da conversão de tipo inteiro em caracteres. Aqui convertemos um numero decimal em um caractecaractere ASCII.
<syntaxhighlight lang="C">
#include <stdio.h>
Linha 127 ⟶ 165:
x = (char) y;
printf("O numero inteiro: %d \n O caracter: %c \n\n", y, x);
}
}</syntaxhighlight>
 
==== Sinal: <code>signed</code> e <code>unsigned</code> ====
Existe outro tipo de modificador, que define se o número vai ser guardado com '''sinal''' ou não. São os modificadores <code>signed</code> e <code>unsigned</code>, suportados pelos tipos inteiros apenas.
 
* '''<code>signed</code>''' diz que o número deve ser guardado com sinal, ou seja, serão permitidos valores positivos e negativos. Esse é o padrão, portanto esse modificador não é muito usado.
* '''<code>unsigned</code>''' diz que o número deve ser guardado '''sem sinal'''. Com isso, o valor máximo da variável aumenta, já que não teremos mais valores negativos. Por exemplo, com uma variável <code>char</code> podemos guardar valores de -128 a 127, mas com uma variável <code>unsigned char</code> pode guardar valores de 0 a 255.
 
Para usar esses modificadores, devemos colocá-los '''antes''' do nome do tipo da variável, sendo que o modificador de sinal deve vir antes do modificador de tamanho caso ambos sejam usados. Por exemplo:
 
'''unsigned char''' c;
'''short int''' valor;
'''unsigned long int''' resultado;
'''long double''' preco;
 
<div style="background-color: #ddffdd; padding: 10px; margin: 20px;">'''Nota:''' Você pode abreviar <code>short int</code> e <code>long int</code> para simplesmente <code>short</code> e <code>long</code>, respectivamente.</div>
 
== Literais ==