radiobutton - radio button java eclipse
Incremento en la funciĆ³n sobrescrita por+= (2)
Un método llamado en un operador ternario incrementa una variable y devuelve un valor booleano. Cuando la función devuelve falso, el valor se revierte. Esperaba que la variable fuera 1 pero obtendría 0 en su lugar. ¿Por qué?
public class Main {
public int a=0;//variable whose value is to be increased in function
boolean function(){
a++;
return false;
}
public static void main(String argv[]){
Main m=new Main();
m.a+=(m.function()?1:0);
System.out.println(m.a);//expected output to be 1 but got a 0 !!!!!
}
}
Básicamente ma += (m.function() ? 1 : 0)
compila en
int t = m.a; // t=0 (bytecode GETFIELD)
int r = m.function() ? 1 : 0; // r = 0 (INVOKEVIRTURAL and, IIRC, do a conditional jump)
int f = t + r; // f = 0 (IADD)
m.a = f // whatever m.a was before, now it is 0 (PUTFIELD)
El comportamiento anterior se especifica en JLS 15.26.2 (edición de JAVA SE 8)
Tiene dos operaciones operando en ma
en una llamada; en main
m.a += (m.function()?1:0);
empuja el valor de a
en el marco y luego invoca m.function()
(que devuelve false
), por lo que el ternario se expande a ma += 0;
(y el valor de ma
del fotograma se agrega a 0
y se almacena en ma
). Por lo tanto, el valor se incrementa en m.function()
(y luego se restablece en main
). Considéralo de esta manera,
m.a = m.a + (m.function() ? 1 : 0);
El valor de ma
se determina antes de la evaluación de m.function()
(por lo tanto, es una operación de incremento posterior). Por el resultado que esperabas , podrías hacer.
m.a = (m.function() ? 1 : 0) + m.a;