20 Ağustos 2019 Salı

İşlem Sırası - Order of Evaluation

Giriş
Order of Evaluation bazı işlemlerin hangi sırada yapılacağının tanımlar. Programlama diline göre sıra değişebilir hatta bir dilde tanımlı olan işlem, başka bir dilde tanımsız olabilir. Özellikle Java ve C++ arasındaki farklar çarpıcı olabiliyor.

1. Metod Çağrısı
Açıklaması şöyle. Metod çağrıları her zaman soldan sağa işlenir.
The Java programming language guarantees that the operands of operators appear to be evaluated in a specific evaluation order, namely, from left to right.
Örnek
Elimizde şöyle bir kod olsun
A() * ( B() + C() )
önce A, sonra B ve sonra da C çağrılır. Daha sonra B ve C'nin sonu toplanıp A'nın sonucu ile çarpılır.

Örnek
Şöyle yaparız. Matematiksel olarak sanki önce f2 * f3 çarpması yapmak gerekir gibi görünse de metod çağrıları soldan sağa işletilir.
int result = f1() + f2()*f3();

f1 working
f2 working
f3 working
2. Aynı parametrenin birden fazla değer değiştirerek kullanılması
Bu işlem soldan sağa olacak şekilde işlenir. Örnek:
t1 = 5;
t2 = t1 + (++t1);
System.out.println (t2);//Sonuç 11'dir
Bu örnek şu şekilde görselleştirilebilir.
    +
  /   \
 t1   ++t1
Örnek:
t1 = 5;
t2 = (++t1) + t1;
System.out.println (t2);//Sonuç 12'dir
Bu tür örnekler çoğaltılabilir. Aşağıdaki kodun sonucunu siz tahmin edin.
int a = 10;
a = ++a * ( ++a + 5);
3. Bileşik Atama İşlemi
Aslında aynı parametrenin birden fazla değer değiştirerek kullanılması ile aynı şey. Ancak biraz daha detaylı olsun diye yeni başlık altına altım. Açıklaması şöyle
If the operator is a compound-assignment operator (§15.26.2), then evaluation of the left-hand operand includes both remembering the variable that the left-hand operand denotes and fetching and saving that variable's value for use in the implied binary operation.
Example 15.7.1-2. Implicit Left-Hand Operand In Operator Of Compound Assigment
In the following program, the two assignment statements both fetch and remember the value of the left-hand operand, which is 9, before the right-hand operand of the addition operator is evaluated, at which point the variable is set to 3.

Şöyledir
int a = 9;
a += (a = 3);  
System.out.println(a); //12int b = 9;
b = b + (b = 3);  
System.out.println(b); //12
Diğer
Order of Evaluation ile ilgisi olmayan bazı konular.

== operator
Bu operator'ün her zaman sol tarafı önce işletilir. Açıklaması şöyle.
The left-hand operand of a binary operator appears to be fully evaluated before any part of the right-hand operand is evaluated.
Örnek
Şöyle yaparız.
class Quirky {
  public static void main(String[] args) {
    int x = 1;
    int y = 3;

    System.out.println(x == (x = y)); // false
    x = 1; // reset
    System.out.println((x = y) == x); // true . Önce sol taraf işletilir
  }
}



Hiç yorum yok:

Yorum Gönder