| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/05/2011 11:53:49
|
ppontes
Thread.start()
![[Avatar]](/images/avatar/3791226cb3fcb9a6710e1ead55571d86.jpg)
Membro desde: 18/07/2006 19:38:40
Mensagens: 32
Offline
|
galera tô com uma dúvida aqui parece até ser bestinha mas alguém por gentileza pode me explicar essa diferença de resultado, pois em C e Java é o mesmo código pra cada linguagem só que as saídas são diferentes:
Códgio em Java:
Saída: -10
Código em C:
Saída: -9
obs: o código é exatamente esse mesmo não precisa usar parênteses nem nada não do jeito que tá aí!
obrigado,
abraços
This message was edited 1 time. Last update was at 18/05/2011 13:36:31
|
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/05/2011 11:58:59
|
JhowTroMundo
JavaTeenager
![[Avatar]](/images/avatar/d01345dc409133f6b3600e648f0a74fa.jpg)
Membro desde: 15/09/2009 02:33:50
Mensagens: 167
Localização: São Paulo
Offline
|
tenta fazer isso e vê o que acontece:
Por que?
C é C e Java é Java.
This message was edited 1 time. Last update was at 18/05/2011 12:02:11
|
The more men talk, the less they think. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/05/2011 12:01:24
|
dionat4n
JavaEvangelist
![[Avatar]](/images/avatar/513d6bdbaed51319e9aa9f84a7f7518e.jpg)
Membro desde: 04/06/2008 21:08:05
Mensagens: 358
Localização: Porto Alegre (RS)
Offline
|
Ok, então a precedência dos operadores menos "-" e pós-incremento "++" em C e Java são diferentes, isso é válido. Interessante!
Teste se é compilável e qual o resultado com o pré-incremento:
|
Dionatan Moura
CTFL-BSTQB
OCPJP 6 (SCJP) 96%
MPS-BR C1
"Genius is 1% inspiration, 99% perspiration." T.E. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/05/2011 12:06:26
|
ppontes
Thread.start()
![[Avatar]](/images/avatar/3791226cb3fcb9a6710e1ead55571d86.jpg)
Membro desde: 18/07/2006 19:38:40
Mensagens: 32
Offline
|
nesse caso
a saída é a mesma pra Java e C onde ele irá executar primeiro negar e depois pre-incremento...
mas voltando ao assunto alguém sabe me dizer o pq???
obrigado,
abraços
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/05/2011 12:11:31
|
Arizoide
Thread.start()
Membro desde: 18/05/2011 06:59:54
Mensagens: 34
Offline
|
Interessante. Me esclareceu bem tbm, já que sou iniciante.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/05/2011 12:18:29
|
bezier curve
JavaEvangelist
Membro desde: 28/11/2009 17:55:58
Mensagens: 411
Offline
|
Truques com "++" e "--" são típicos de professores que não passaram da primeira apostila de programação Java e não aprenderam o essencial, só as pegadinhas.
Tais professores, infelizmente, não são raros, e deveriam ser atirados ao fundo do mar, junto com aqueles escandalosos citados por Jesus:
Mas qualquer que escandalizar um destes pequeninos que crêem em mim, melhor lhe fora que se lhe pendurasse ao pescoço uma mó de azenha, e se submergisse na profundeza do mar.
É bom saber que tais coisas existem (acho que tais coisas, com pegadinhas, nem caem mais na prova de certificação), mas evite sempre escrever código que precise usar esses truques sujos. É por que ninguém que vai consertar seu código (incluindo você mesmo) vai acabar entendendo o que realmente está sendo feito.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/05/2011 12:25:24
|
ppontes
Thread.start()
![[Avatar]](/images/avatar/3791226cb3fcb9a6710e1ead55571d86.jpg)
Membro desde: 18/07/2006 19:38:40
Mensagens: 32
Offline
|
bezier curve kkkkkk você é engraçado mas deixando as piadinhas de lado sempre é bom saber o pq dessas diferenças apesar desse código jamais seja programado desta forma. Mas a pergunta é a seguinte se Java se baseou no C++ que este tbm se baseou no C então existe um pq da diferença de resultados...
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/05/2011 12:30:35
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20587
Localização: Curitiba/PR
Offline
|
ppontes wrote:bezier curve kkkkkk você é engraçado mas deixando as piadinhas de lado sempre é bom saber o pq dessas diferenças apesar desse código jamais seja programado desta forma. Mas a pergunta é a seguinte se Java se baseou no C++ que este tbm se baseou no C então existe um pq da diferença de resultados...
Sim, a razão é "porque não programaram igual".
O pós e pré incremento não são exatamente um operadores matemático padrão.
Sua precedência é sujeita a interpretação ou, pior ainda, ao gosto de quem cria a linguagem.
Quanto ao que o beziér disse, só posso afirmar uma coisa: "Amém".
|
@ViniGodoy - Lattes
Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!
Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).
Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/05/2011 12:42:36
|
ppontes
Thread.start()
![[Avatar]](/images/avatar/3791226cb3fcb9a6710e1ead55571d86.jpg)
Membro desde: 18/07/2006 19:38:40
Mensagens: 32
Offline
|
desculpa ViniGodoy mas resposta como "porque não programaram igual" é a mesma coisa de "...vou responder qualquer coisa pra tirar esse cara de tempo..." só lembrando os operadores unários tanto em C e Java tem a mesma precedência e associatividade como podem ser programados diferentes??
This message was edited 3 times. Last update was at 18/05/2011 14:00:46
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/05/2011 13:01:19
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20587
Localização: Curitiba/PR
Offline
|
Não, não.
Estou falando sério. Muitas das decisões são especificas de implementação.
Então, a razão é exatamente: "porque fizeram assim".
Especialmente quando você usa um operador de atribuição, que recebe o valor de um pós incremento. Essa é operação que em C é considerada "undefined behavior" e, de fato, seu comportamento pode variar de compilador para compilador.
|
@ViniGodoy - Lattes
Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!
Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).
Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/05/2011 13:10:25
|
dionat4n
JavaEvangelist
![[Avatar]](/images/avatar/513d6bdbaed51319e9aa9f84a7f7518e.jpg)
Membro desde: 04/06/2008 21:08:05
Mensagens: 358
Localização: Porto Alegre (RS)
Offline
|
Nunca li em algum documento oficial de que Java que se é utilizado exatamente a mesma precedência que em C/C++. Provavelmente alguém com conhecimento (algum professor ou no fórum) falou que é a mesma precedência, mas certamente não é oficialmente e exatamente a mesma.
Esse tipo de programação não deve ser feito. Deveria-se utilizar parênteses ou duas atribuições, na ordem que preferir. O programador pode entender, mas quem dar manutenção não irá entender, o que vai acabar entrando na refatoração de código do sistema.
|
Dionatan Moura
CTFL-BSTQB
OCPJP 6 (SCJP) 96%
MPS-BR C1
"Genius is 1% inspiration, 99% perspiration." T.E. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/05/2011 13:17:22
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20587
Localização: Curitiba/PR
Offline
|
Ok. Vou te explicar a parte do "porque quiseram assim". Em Java, uma expressão como: i = i++; É interpretada da seguinte forma: No C não existe uma definição clara do que isso pode fazer. Porém, na maior parte das implementações que conheço, isso será interpretado da seguinte forma: Ou seja, no C, graças a sua política minimalista, fazem o que chamamos de "delayed increment". Entretanto, em c ou c++, receber o valor de uma variável que foi pós incrementada na própria variável é considerado um estilo pobre de programação, até porque, isso em C é um "undefined behavior", o que quer dizer que o padrão não cobre esse caso em específico. Então, não seria estranho encontrar compiladores que geram resultados iguais ao do Java. Ou mesmo, descobrir um compilador que gera resultados diferentes usando políticas diferentes de otimização (mais raro, porém, nada se garante em undefined behaviors). Isso explica porque esse código imprime 0 em Java, e 1 em C: Como falei anteriormente, não existe uma especificação matemática para o operador de "pós incremento". Como ele não é parte da matemática padrão sua implementação está sujeita ao gosto ou entendimento do criador da linguagem ou do compilador. Por isso simplesmente olhar para a tabela de precedência não diz muita coisa.
This message was edited 3 times. Last update was at 18/05/2011 13:21:47
|
@ViniGodoy - Lattes
Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!
Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).
Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/05/2011 13:23:29
|
ppontes
Thread.start()
![[Avatar]](/images/avatar/3791226cb3fcb9a6710e1ead55571d86.jpg)
Membro desde: 18/07/2006 19:38:40
Mensagens: 32
Offline
|
hum então seria isso o compilador escolherá a melhor forma de fazer ?? Ou seja dois compiladores de C distintos poderá ter resultados diferentes??
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/05/2011 13:29:00
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20587
Localização: Curitiba/PR
Offline
|
ppontes wrote:hum então seria isso o compilador escolherá a melhor forma de fazer ?? Ou seja dois compiladores de C distintos poderá ter resultados diferentes??
Sim. "undefined behavior" significa que não está especificado no padrão e, portanto, fica sujeito a interpretação de quem lê.
Aliás, essa não é a única operação desse tipo em C, várias outras podem gerar undefined behaviors.
Não é à toa que existe um tópico inteiro da wiki dedicado ao assunto:
http://en.wikipedia.org/wiki/Undefined_behavior
Outro interessante que vi lá:
|
@ViniGodoy - Lattes
Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!
Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).
Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/05/2011 13:35:25
|
ppontes
Thread.start()
![[Avatar]](/images/avatar/3791226cb3fcb9a6710e1ead55571d86.jpg)
Membro desde: 18/07/2006 19:38:40
Mensagens: 32
Offline
|
Blz valeu pelos esclarecimentos ViniGodoy
|
|
|
 |
|
|