JavaScript Temelleri

Bölüm 2

Temel Bilgiler

2.7 - Aritmetik İşlemciler (Devam)

Bölüm 2 Sayfa 8

2.7.3 - İkili Aritmetik İşlemciler

İkili aritmetik işlemciler, İşlemciler tablosunda görülen ikili aritmetik işlemciler, aşağıdaki tabloda verilmiştir

İkili Aritmetik İşlemciler
İşlemci Adı
+ İkili Artı İşlemcisi
> - İkili Eksi İşlemcisi
> * Çarpım İşlemcisi
> / Bölüm İşlemcisi
> % Modulo İşlemcisi

İkli işlemcilerin çalışma şekilleri,

sol işlenen işlemci sağ işlenen;

olarak tanımlanır. Burada incelenen işlemciler, aritmetik hesaplama yapmak için kullanıldıklarından her iki işleninde veri tipi sayısal veya sayıya dönüştürülebilen tipte veriler olmalıdır. Aksi halde NaN kuraldışılık hatası oluşur. Toplama ve çıkarma işlemcilerinde işlenenler sözel de olabilir.

Toplama işleminin sonuçları IEE 754 çift duyarlıklı aritmetik koşullarına göre yürütülür:

İkili toplama ve çıkarma işlemcilerinin işlenenleri, bu kategoride sözel tipte de olabilen tek işlemci tipidir. Bu işlemci her iki işlenen aynı tipte ise sol işlenenin değerini sağ işlenen ile toplar veya sağ işlenenin değerini sol işlenenden çıkarır. Sayısal verilerle bu işlemin nasıl sonuçlanacağı açıktır. Fakat sözel verilerle alışılagelmiş yöntem karakter dizgisi toplamasıdır ve iki karakter dizesinin birbirine eklenmesi ile karakter dizgisi birleşimi (string concatenation) sonucunu verir. Sözel veri birleşimi yönteminin bir uygulamasının, JavaScript kodları aşağıda görülmektedir.

/* <![CDATA[  */

/* Bu Program bdelib.js Kitaplık Programını Kullanmaktadır */

function sözelVeriBirleşimi(sağİşlenen, solİşlenen) {
x = sağİşlenen + solİşlenen;
return x;
}

function başlat() {

var q = sözelVeriBirleşimi('23', ' Nisan');
veriTipiYaz(q, 'b2.7.3.1-uyg-1-sonuç-1');
}

sayfaYüklendiktenSonraÇalıştır(başlat);

/* ]]> */
		

Sonuç :

Aynı sonucu, JavaScriptDeneme.htm programında bir eval() makrosu yazarak da alabiliriz. eval() metodu, Global JavaScript Nesnesinin öntanımlı bir metodudur ve global bir hazır fonksiyon olarak kullanılabilmektedir. eval() Metodu, 3.3.1 de açıklanmıştır. eval() Metodunun argümanı bir karakter dizigisi literalidir. Bu literal tüm bir JavaScript programını içerebilir. eval() Metodunun özelliği, bir çeşit bağımsız programlama ortamı olmasıdır. Argümanı olan karakter dizigisi verisindeki tüm programlama adımlarını değerlendirir ve en son hesaplanan değeri geri döndürür. JavaScriptDeneme.htm programı, kullanıcı ile etkileşimli (interaktif) bir Web sayfasıdır. JavaScriptDeneme.htm programının kaynak kodları, 3.3.1 de verilmiştir. Bu programdaki metin kutusuna, aynı eval() metodununa aktarılan argüman gibi kodlar yazılıp İşlemi Yap ! düğmesi tıklatılınca, eval() metodu çalışır, verilen kodları değerlendirir ve sonucu sonuç kutusunda görüntüler. Bu program çok pratik ve küçük programlarının sonucunu kontrol etmek için çok yararlı olabilir. JavaScriptDeneme.htm programının değerlendirme kutusuna girilmesi için, aşağıdaki kodlar yazılmıştır. Sadece eval() metodunun sonucunu görüntüleyebileceği bu kodlar, kopyalanıp, JavaScriptDeneme.htm programının değerlendirme kutusuna girilebilir.

z = "23" + " Nisan";
z + " (" + typeof z + ")" ;

Bundan sonra İşlemi Yap ! düğmesine basılıp sonuç görüntülenir.

Aritmetik toplama/çıkarma işlemlerinde, her iki işlenenin veri tipi birbirinin aynı ise, sonucun veri tipi de işlenenlerin aynıdır. Fakat, işlenenlerin veri tipleri farklı ise, JavaScript yorumlayıcısının eşsiz uyarlama sistemi veri tiplerini birbirine uyarlamaya çalışarak işlemi yapılabilir hale getirmeye gayret eder. Burada dikkat edilecek nokta, uyarlamanın her zaman kullanıcının öngördüğü yöne doğru gerçekleşmeyebileceğidir.

Bir aritmetik toplama/çıkarma işleminde, işlenenlerden birisi sayısal diğeri sözel ise, işlem aritmetik toplama değil sözel veri birleştirmesi olarak gerçekleşir ve sonucun veri tipi sözel (string) olur. Bu konuda bir uygulamanın, JavaScript kodları aşağıda görülmektedir.

/* <![CDATA[  */

/* Bu Program bdelib.js Kitaplık Programını Kullanmaktadır */

function aritmetikToplama(sağİşlenen, solİşlenen) {
x = sağİşlenen + solİşlenen;
return x;
}

function başlat() {

var q = aritmetikToplama('2', 2);
veriTipiYaz(q, 'b2.7.3.1-uyg-2-sonuç-1');
}

sayfaYüklendiktenSonraÇalıştır(başlat);

/* ]]> */
		

Sonuç :

Sonuçlar, uyarlamanın her ikinci verinin de sözel tipe dönüştürüldüğü ve aritmetik toplama yerine sözel veri birleştirilmesi yapıldığını belirtmektedir. Bu uygulama, uyumsuz verilerle uygulanacak veri tipi uyarlamalarının her zaman istenen yönde gelişmeyeceğini belirten bir uyarma olarak algılanabilir.

Toplama işlemcisi her zaman toplanabilir (associative) özellik göstermez. 1 + 2 + 'Nisan' ifadesi 3Nisan olarak değerlendirilirken 'Nisan' + 1 + 2 ifadesi, Nisan12 olarak değerlendirilir. Bu gibi her yöne çekilebilecek ifadelerden uzak durulması gerekir. Amacımız, JavaScript yorumlayıcısına açık ve net olarak bildirilmelidir. Gerekirse ön işlemler yapılmalı, parantezler kullanılmalı ve en sonra, en doğru olarak değerlendirilecek şekilde ifadeler yazılmalıdır.

Eğer amaç aritmetik toplama ise ve verilerden biri sayısala çevrilebilir sözel tipte bir veri ise, işlemci uygulamasından önce, verilerin kullanıcı tarafından uyumlu hale getirilmesi gerekecektir. Bu durumda, sözel verinin toplama işleminden önce kullanıcı tarafından sayısal tipe dönüştürülmesi gerekir. Bu işlem açık (explicit) veri tipi dönüştürülmesi olarak adlandırılır.

JavaScript programlama dilinde, sözel bir verinin sayısala dönüştürülmesi için kullanılabilecek çeşitli öntanımlı olanaklar bulunmaktadır. Bunları konular ilerledikçe sırası ile inceleyeceğiz. Burada kullanacağımız sözelden sayısala açık tip dönüştürme yöntemi, biraz önce incelediğimiz, tekli arttırım işlemcisinden yararlanılarak gerçekleştirilebilecek açık tip dönüşümü olacaktır. Bu yöntemin, JavaScript kodları aşağıda görülmektedir.

/* <![CDATA[  */

/* Bu Program bdelib.js Kitaplık Programını Kullanmaktadır */

function sözeldenSayısala_2(sözel) {
sözel++;
return sözel - 1;
}

function aritmetikToplama(sağİşlenen, solİşlenen) {
x = sağİşlenen + solİşlenen;
return x;
}

function başlat() {
var a = '2', b = 2, q = null;

a = sözeldenSayısala_2(a);
var q = aritmetikToplama(a, b);
veriTipiYaz(q, 'b2.7.3.1-uyg-3-sonuç-1');
}

sayfaYüklendiktenSonraÇalıştır(başlat);

/* ]]> */
		

Sonuç :

Uygulama sonuçlarından da görüldüğüne göre, açık veri tipi dönüştürümü gerçekleştirildiğinde, işlemin yönü istenilen yönde değişmekte yani aritmetik toplama yapılmaktadır.

Javascript programlama dilinde, sayısal bir bir veriyi açık olarak sözel tipe çevirmek için, en sık uygulanan yöntemlerden birisi, bu veriye boş bir karakter dizgisi ('' veya"") eklemektir. Böyle bir uygulamanın, JavaScript kodları aşağıda görülmektedir.

/* <![CDATA[  */

/* Bu Program bdelib.js Kitaplık Programını Kullanmaktadır */

function sayısaldanSözele_1(sayısal) {
return sayısal + ''; // boş bir karakter dizgisi eklenmektedir.
}


function başlat() {
var alfa = 2;

alfa = sayısaldanSözele_1(alfa);

veriTipiYaz(alfa, 'b2.7.3.1-uyg-4-sonuç-1');
}


sayfaYüklendiktenSonraÇalıştır(başlat);

/* ]]> */
		

Sonuç :

Çıkarma işlemcisi -, iki sayısal işlenen üzerine uygulandığında, işlenenlerın değerlerinin farkını döndürür. Sol işlenen çıkaran sağ işlemci ise çıkartılandır. Eğer a ve b sayısal işlenenler ise, a-b daima a+(-b) işlemi ile aynı sonucu verecektir.

Javascript programlama dilinde, çıkarma işlemcisinin, toplama işlemcisinden tek farkı, işlenenlerin veri tipinin birbirinden farklı olması durumunda, işlenenleri sayısal tipe uyarlamaya çalışmasıdır. Bu özellik programcılara, sözel verilerin açık olarak sayısala dönüştürülebilmesi için ikinci bir yöntemi kazandırmaktadır. Böyle bir uygulamanın, JavaScript kodları aşağıda görülmektedir.

/* <![CDATA[  */

/* Bu Program bdelib.js Kitaplık Programını Kullanmaktadır */

function sözeldenSayısala_3(sözel) {
return sözel - 0;
}

function aritmetikToplama(sağİşlenen, solİşlenen) {
x = sağİşlenen + solİşlenen;
return x;
}

function başlat() {
var a = '2', b = 2, q = null;

a = sözeldenSayısala_3(a);
var q = aritmetikToplama(a, b);
veriTipiYaz(q, 'b2.7.3.1-uyg-5-sonuç-1');
}

sayfaYüklendiktenSonraÇalıştır(başlat);

/* ]]> */
		

Sonuç :

Çarpma işlemcisi uygulamalarında aşağıdaki sonuçlar ortaya çıkabilir :

Çarpma işlemcisi, işlenenlerinden birisi sayıya dönüştürülebilen bir veri olması durumunda, bunu sayıya uyarlamaya çalışarak işlemi gerçekleştirme yoluna gider. Bu da bizlere sözel verileri sayısal tipe dönüştürme için yeni bir açık yöntem olanağı sağlar. Bu konuda bir uygulamanın, JavaScript kodları aşağıda görülmektedir.

/* <![CDATA[  */

/* Bu Program bdelib.js Kitaplık Programını Kullanmaktadır */

function sözeldenSayısala_4(sözel) {
return sözel * 1;
}

function aritmetikToplama(sağİşlenen, solİşlenen) {
x = sağİşlenen + solİşlenen;
return x;
}

function başlat() {
var a = '2', b = 2, q = null;

a = sözeldenSayısala_3(a);
var q = aritmetikToplama(a, b);
veriTipiYaz(q, 'b2.7.3.2-uyg-1-sonuç-1');
}

sayfaYüklendiktenSonraÇalıştır(başlat);

/* ]]> */
		

Sonuç :

Bölme işlemcisi uygulamalarında aşağıdaki sonuçlar ortaya çıkabilir :

Bölme işlemcisi, işlenenlerinden birisi sayıya dönüştürülebilen bir veri olması durumunda, bunu sayıya uyarlamaya çalışarak işlemi gerçekleştirme yoluna gider. Bu da bizlere sözel verileri sayısal tipe dönüştürme için yeni bir açık yöntem olanağı sağlar. Bu konuda bir uygulamanın, JavaScript kodları aşağıda görülmektedir.

/* <![CDATA[  */

/* Bu Program bdelib.js Kitaplık Programını Kullanmaktadır */

function sözeldenSayısala_5(sözel) {
return sözel / 1;
}

function aritmetikToplama(sağİşlenen, solİşlenen) {
x = sağİşlenen + solİşlenen;
return x;
}

function başlat() {
var a = '2', b = 2, q = null;

a = sözeldenSayısala_5(a);
var q = aritmetikToplama(a, b);
veriTipiYaz(q, 'b2.7.3.3-uyg-1-sonuç-1');
}

sayfaYüklendiktenSonraÇalıştır(başlat);

/* ]]> */
		

Sonuç :

Modulo işlemcisi içsel bir bölme işleminin sonucunda, işlenenlerin kalanını geri döndürür. Sağ taraf bölen sol taraf bölünendir.

Modulo işleminin sonucu, IEEE aritmetik kurallarına göre belirlenir:

Birçok programlama dilinde modulo işlemcisinin işlenenleri olarak sadece tamsayılar kullanılabilmesine karşın, Javascript programlama dilinde kayan noktalı (ondalıklı) sayılar da kullanılabilmektedir. Bu işlemcinin sonuçları bir tür yaklaşım göstergesi gibi kabul edilebilir. Fazla pratik bir matematik işlevi yoktur.

Valid XHTML 1.1