OCA Java imtahan mövzuları

if Statement | if-then Statement (dangling else)

The if Statement

if operatorunun nə üçün istifadə olunduğu çox güman hamıya məlumdur. Ona görə də sadəcə if ilə bağlı bir neçə maraqlı nümunəyə baxaq:

// nümunə 1
int i;
if(true) i = 20;
int k = i;

// nümunə 2
int i;
if(false) i = 20;
int k = i;        // DOES NOT COMPILE

// nümunə 3
int i;
if(5 > 3) i = 20;
int k = i;

// nümunə 4
int i;
if(5 > 6) i = 20;
int k = i;        // DOES NOT COMPILE

// nümunə 5
boolean condition = true;
int i;
if(condition) i = 20;
int k = i;         // DOES NOT COMPILE

// nümunə 6
final boolean condition;
condition = true;
int i;
if(condition) i = 20;
int k = i;         // DOES NOT COMPILE

// nümunə 7
final boolean condition = true;
int i;
if(condition) i = 20;
int k = i;

Əlavə olaraq qeyd edək ki, əgər if ifadəsindən sonra fiqurlu mötərizə açılmazsa, if`dən sonra gələn ancaq bir ifadə ona aid edilir.

if fiqurlu mötərizə ilə, ona aid else isə mötərizəsiz işlənə bilər:

int i = 1;
if(i > 2) { i = 3; }
else i = 2;

İmtahanda mən rast gəlməmişəm, amma hər ehtimala qarşı aşağıdakı kod yazılışlarına da baxa bilərsiniz:

if(true) else;        // illegal
if(true) if(false);   // valid

 

The if-then Statement (dangling else)

Bəzən imtahanda if ifadəsi ilə bağlı çaşdırıcı formatda olan suallarla rastlaşa bilərsiniz. Aşağıdakı nümunəyə baxaq:

public static void main(String[] args) {
    boolean a = true;
    boolean b = false;
    boolean c = true;

    if(a==true)
    if(b==true)
    if(c==true) System.out.println(1);
    else System.out.println(2);
    else if(a&&(b=c)) System.out.println(3);
    else System.out.println(4);
}

Burada hansı else ifadəsinin hansı if ifadəsinə aid olmasını təyin etmək çətindir. Bu formada verilmiş nümunə “dangling else” problemi adlandırılır. Bura qədər biz belə öyrənmişdik ki, if ifadəsindən sonra fiqurlu mötərizə açılmazsa, if`dən sonra gələn ancaq bir ifadə ona aid edilir. Bu məntiqlə yanaşsaq 1-ci if`in tərkibinə ancaq 2-ci if ifadəsi aiddir. Eyni məntiqlə, 2-ci if`in tərkibinə 3-cü if ifadəsi və 3-cü if`in tərkibinə də System.out.println(1); ifadəsi daxildir. Eyni ardıcıllıqla davam etsək, 1-ci else ifadəsi onda 1-ci if ifadəsinə məxsus olmalıdır və belə olanda halda da kod compile xətası verməlidir, çünki else if ifadəsi else ifadəsindən sonra gələ bilməz. Amma kod xəta vermədən normal compile olunur və console`da alınan nəticə də 3 olur.

Kodun necə işlədiyini daha aydın başa düşmək üçün IDE`də kodu normal formata salıb (Netbeans`də Alt-Shift-F ) yenidən baxaq, bu zaman hər şey aydın olacaq:

public static void main(String[] args) {
    boolean a = true;
    boolean b = false;
    boolean c = true;

    if (a == true) {
        if (b == true) {
            if (c == true) {
                System.out.println(1);
            } else {
                System.out.println(2);
            }
        } else if (a && (b = c)) {
            System.out.println(3);
        } else {
            System.out.println(4);
        }
    }
}

Formatdan sonra kodun hansı məntiqlə işlədiyi artıq aydın göründü, qaldı səbəbini bilmək. Səbəbi JLS`də açıq-aşkar qeyd olunub:

“..an else clause belongs to the innermost if to which it might possibly belong.

Yəni əgər fiqurlu mötərizə yoxdursa, else şərti ən içdəki (innermost) if`ə aiddir. Əlavə məlumat üçün aşağıdakılara linklərə baxa bilərsiniz:

 

[topics lang=az]

About the author

Mushfiq Mammadov

Leave a Comment


The reCAPTCHA verification period has expired. Please reload the page.

 

This site uses Akismet to reduce spam. Learn how your comment data is processed.