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]
