IOCCC em Java

int x;
x = (x=1) + (x=7)* (- - x); 
System.out.println("Valor de x é:"+ x );
Valor de x é:50

E eu achando que conhecia um pouco de java.
:lol: :lol:

retorno de atribuicao é o novo valor na maioria das linguagens…

Não entendi porque dá 50 o.o não deveria dar 43? Louds? Thingol? Alguém?

 x = (x=1) + (x=7)* (- - x); 

Na ordem:
x = 1 -> x = 1 + (x=7)* (- - x);
x = 7 -> x = 1 + 7* (- - x);

  • x -> x = 1 + 7*(- -7); // Sete negativo
  • x -> x = 1 + 7* 7;
    7*7 -> x = 1 + 49;
    1+49 -> x = 50;

Se fosse (-- x) , sem espaços entre os dois “-” o terceiro parênteses daria 6.

Acho q é isso…

Exatamente isso.

Encontrei outra coisa legal em um blog estes dias.
Da pra trocar o valor de duas variaveis sem usar uma auxiliar?
Pois é eu achava que não tbm. Mas… :shock:

public class Main {
    public int a;
    public int b;
    
    public static void main(String[] args) {
        
        Main main = new Main();
        main.a=654894;
        main.b=444444;
        main.show();
        main.swap();
        main.show();
    }
    
    public void show() {
        System.out.println("a=="+this.a);
        System.out.println("b=="+this.b);
    }

    public void swap(){
        a=a ^ b;
        b=a ^ b;
        a=a ^ b;
    }
}

http://pt.wikipedia.org/wiki/Algoritmo_Xor_Swap
:lol:

Esse algoritmo de trocar os valores é bom mesmo. Tivemos isso como desafio numa aula de C na faculdade.
É óbvio que eu não consegui resolver por conta própria. :lol:

A função swap tb podia ser assim:

swap(){
  a = a+b;
  b = a-b;
  a = a-b;
}

Agora uma pergunta pros mais entendidos… o que é mais barato para o processador? Soma e subtração ou exponencial?

Na minha opinião:

Soma e subtração

Tá, vcs vao achar isso uma preocupação idiota, até q é, + eh q a minha realidade me obriga a pensar que 4kb de memória é muito. ((;

[quote=bandrade]A função swap tb podia ser assim:

swap(){
  a = a+b;
  b = a-b;
  a = a-b;
}

Agora uma pergunta pros mais entendidos… o que é mais barato para o processador? Soma e subtração ou exponencial?

Na minha opinião:

Soma e subtração

Tá, vcs vao achar isso uma preocupação idiota, até q é, + eh q a minha realidade me obriga a pensar que 4kb de memória é muito. ((;[/quote]

O operador ^ não é exponencial em Java, é o XOR (ou exclusivo) bitwise. Como esse simplesmente troca os valores dos bits que formam os números, é mais barato para o processador.

O algoritmo da soma e subtração pode dar problema quando os valores de x e y estão perto de Integer.MAX_VALUE ou Integer.MIN_VALUE.

Pense em uma coisa:
exponencial são multiplicações sucessivas.
multiplicação são somas sucessivas.
Já matou? :wink:

Ah, os espacinhos. Valeu :smiley:

Ai… eu amo o Guj.

#@®®¡$ (que tipo de nick eh esse?): não sabia desse operador ^. Muito obrigado pelo esclarecimento. E sim, trocar com somas é perigoso perto das bordas.

Ironlynx: chutei certo então, ufa… até que não sou tão ruim de lógica.

Lipe: Pq vc não tá com nenhuma avatar absolutamente estranho hoje??

Hasta: ö, quer dizer, hasta num é ninguém, bandrade idiota é só dar tchau.

((;

Pense em uma coisa:
exponencial são multiplicações sucessivas.
multiplicação são somas sucessivas.
Já matou? :wink: [/quote]

Multiplicação pode ser definida de muitas formas. Usando soma é como aprendemos na escola, mas longe de ser a melhor para computação.

A-ham, mesmo soma e adição podem ser diferentes dependendo do sistema computacional.Fora FPU´s,operações quanticas entre outras.
Mas basicamente, num universo binário simplificado (um x86) da vida, o comportamento será o mesmo do que eu descrevi.Claro, há sistemas com multiplicadores por hardware(dedicado a multiplicar dois valores binários) usando árvores de Wallace, usados atualmente, melhoram(e muito) a performance da forma original de Acc=soma+1… blblabla.Mas a origem, foi a velha “sequência de somas”.

O tipo de nick que alguém inventa quando quer fazer um nick mais complicado que o próprio nome. :lol:

[quote=LucasUyezu] x = (x=1) + (x=7)* (- - x);

Na ordem:
x = 1 -> x = 1 + (x=7)* (- - x);
x = 7 -> x = 1 + 7* (- - x);

  • x -> x = 1 + 7*(- -7); // Sete negativo
  • x -> x = 1 + 7* 7;
    7*7 -> x = 1 + 49;
    1+49 -> x = 50;

Se fosse (-- x) , sem espaços entre os dois “-” o terceiro parênteses daria 6.

Acho q é isso…
[/quote]

hã? :? :?: :?