Java >> Java Program >  >> Java

hur arbetar denna ternära operatör med detta uttalande?

Jag genererar bara den här metoden för att hitta max val i någon matris och på något sätt kunde jag ändra int val insdie Ternary Operator (java 8)

int  max=0, indexToReturn=0;
        int size= arr[0].length;
        for (int i=1 ; i < size ; i++)
        {
            //
            //                                                 ¯_(ツ)_/¯
            max =  (!(arr[j][indexToReturn] > arr[j][i])) ? indexToReturn= i : arr[j][indexToReturn] ;
        }
     return max > 0 ||  indexToReturn==size-1 ? arr[j][indexToReturn] : null;

(metoden kompilera och arbeta)

Jag är inte riktigt säker på evan hur det kompileras från vad jag såg online Ternary Operator-syntax:

variable = Expression1 ? Expression2: Expression3

kan någon förklara för mig vad jag saknar här?

Svar

Anledningen till att detta fungerar är för att ett uppdrag är ett uttryck. Värdet av ett uppdrag är det tilldelade värdet. Detta låter teoretiskt, så låt oss titta på ett exempel:

int i, k;
i = (k = 5);
System.out.println(i);
System.out.println(k);

Ideone-demo

Värdet för uttrycket k = 5 är det tilldelade värdet 5 . Detta värde tilldelas sedan i .

Beväpnade med denna kunskap ser vi att indexToReturn= i är ett uttryck som utvärderas till värdet i . När vi byter Expression2 och Expression3 , den ternära operatorn bryter eftersom = i utvärderas inte som en del av den ternära operatören (på grund av operatörens företräde). Om vi ​​sätter parenteser runt Expression2 , det fungerar som förväntat.

Jag skulle avråda från att använda det faktum att ett uppdrag är ett uttryck. (Ab)att använda detta faktum leder ofta till svårbegriplig kod.


Java-tagg