Sintaksis:
booleanExpression ? expression1 : expression2
Birinci tərəf mütləq boolean
ifadə olmalıdır, ikinci və üçüncü tərəflər isə mənimsədilən dəyərin tipinə uyğun olmalıdır. Short-circuit operatorlarda olduğu kimi ternary operatorda da runtime vaxtı “?”-dan sonra ancaq iki şərtdən biri icra edilir.
int y = 1; int z = 1; final int x = y < 10 ? y++ : z++; System.out.println(y + "," + z); // output: 2,1
Aşağıda birinci sətirdə istənilən halda ancaq true
şərtinin yerinə yetirilməsinə baxmayaraq hər iki dəyər mənimsədilən dəyişənin tipinə uyğun olmalıdır, ?
simvolundan sağdakı dəyərlərin bir-biri ilə eyni tipdə olması isə tələb deyil:
int x = 6 > 5 ? 6 : "5"; // does not compile System.out.println(6 > 5 ? 6 : "5"); // output is 6
Ternary operatorlarda operatorların yerinə yetirilmə ardıcıllığına diqqət etmək lazımdır. Bir nümunəyə baxaq:
String a = "a"; String b = "b"; final String letter = 213 > 321 ? a : b = "c" ; // DOES NOT COMPILE
Baş verən xəta operatorların icra ardıcıllığından qaynaqlanır. Assignment operator (=
) ternary operatordan (?:
) sonra icra olunur. Daha aydın olması üçün sonuncu sətri bir az formatlaşdırılmış şəklə salaq:
final String letter = (213 > 321 ? a : b) = "c" ; final String letter = "b" = "c" ;
Dəyəri dəyərə mənimsətmək mümkün olmadığından kod compile olunmur. Əgər "b"
əvəzinə b
olsa və yaxud ilk kod nümunəsindəki (b = "c")
mötərizə içində yazılsa kod compile olunar:
final String letter = b = "c" ; final String letter = 213 > 321 ? a : (b = "c");
void
tipində metodların ternary operator ilə istifadəsinə icazə verilmir:
class TestTernaryOperator { public static void main(String[] args) { System.out.println(6>5 ? return1() : return2()); // output: I am String System.out.println(6>5 ? void1() : void2()); // does NOT compile } static String return1(){ return "I am String"; } static int return2(){ return 7; } static void void1(){ System.out.println("I am void 1"); } static void void2(){ System.out.println("I am void 2"); } }
[topics lang=az]