sirve radiobutton que para example ejemplo definicion java variable-assignment increment ternary

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;