Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

Soma com char

De fato, ao fazer uma atribuição a um char onde ocorre a soma de um char com um int, ocorre um erro, porém, existe um jeito de burlar isto.

char valor = 65;

Os códigos abaixo são equivalentes:

valor = valor +1; // Dá erro

valor += 1; // Não dá erro

valor++; // Não dá erro

++valor; // não dá erro

O erro ocorre no momento que o sistema tenta fazer um calculo com char, pois o char possuí 2 valores, o valor numérico (65) e o valor literal (A), e o erro ocorre para indicar ao programador qual valor ele quer somar a 1, pois no caso do literal A, não é possível somar 1+A, mas o char pode armazenar um literal "1" por exemplo que pode ser convertido num int e finalmente somado a 1, neste caso 1+1 =2.

É isso mesmo? Ou estou errado? Porque a atribuição:

valor = 'A' + 1; // É permitido

E neste caso ambas as atribuição são permitidas: int valorInt = 'A' + 1;

char valorChar = 'A'+1;

Porém,

System.out.println(valor); // escreve 66

Mas,

System.out.println(valorChar); // escreve "B"

6 respostas

Vinicius, eu fiz meu código assim:

package br.alura.java.sintaxe.variaveis;

public class TestaCaracteres {


    public static void main(String[] args) {
        char letra = 'a';
        System.out.println(letra);

        char valor = 65;
        System.out.println(valor);

        valor = (char) (valor + 1);
        System.out.println(valor);

        String palavra = "alura cursos online de tecnologia";
        System.out.println(palavra);

        palavra = palavra + 2020;
        System.out.println(palavra);

        valor = 'A' + 1;
        System.out.println(valor);

        char valorChar = 'A' + 1;
        System.out.println(valorChar);

    }

}

Nas últimas duas somas que eu rodei ele imprimiu B no console.

Não acho que é uma forma de burlar, o tipo char guarda apenas um caractere da tabela unicode, por isso, quando passamos um valor numérico, teremos como saída o caractere correspondente ao número na tabela unicode (lembrando sempre que em Java não existe ASCII, eh tudo Unicode.).

solução!

Olha Winter,

char valor = 66;

valor = valor + 1; //

a partir do momento que foi dito que isso dá erro, tentei fazer:

valor++;

Que é equivalente, um incremento de 1 na variável valor, pra mim, isso é uma maneira de burlar/contornar/evitar o erro que dá na instrução valor = valor + 1;

Em relação ao que o tipo char guarda, na verdade ele guarda, na maioria das linguagens de programação, 1 byte ou 8 bits de informação, que representa um valor numérico, que corresponde a um valor literal da tabela ASCII)

A tabela ASCII, como definido, é uma tabela onde existem os valores numéricos e seus correspondentes.

Porém, o Java tem o char como um tipo que é armazenado em 16bits (2bytes) e utiliza a tabela Unicode para o valor literal.

Vinicius,

Entretanto, o Java não trabalha com Ascii e sim com Unicode. Não é problema na maior parte dos casos pois os 255 primeiros caracteres unicode correspondem aos caracteres ascii.

É bom lembrar disso.

Abs.

Verdade meu caro Winter, o char do Java é armazenado num espaço de 16bits (ou 2 bytes) de memória e representa um caracter unicode, para tanto utiliza da tabela unicode.

Olá Vinicius,

Na verdade, seguindo a documentação da linguagem Java vemos que: A compound assignment expression of the form E1 op= E2 is equivalent to E1 = (T) ((E1) op (E2)), where T is the type of E1, except that E1 is evaluated only once.

Ou seja, quando usamos esse tipo de atribuição, na verdade estamos falando que i = (tipo do i) (i + j).

e.g. (tradução livre da documentação)

//o seguinte código é correto:
short x = 3;
x += 4.6;

//e resulta em x tendo o valor 7 porque é equivalente à:
short x = 3;
x = (short)(x + 4.6);

Logo, não se trata de uma maneira de burlar um tipo de erro. Isso é uma característica da linguagem. Como explicado na documentação, o uso de operadores do tipo op= inclui um casting implícito.

Obrigado pelo tempo e bons estudos.

Muito obrigado Lucas, uma resposta bem elucidativa.

Queria marcar como solução, mas já tinha marcado outra resposta. Tem como remarcar?