Aritmetik Operatörler hakkında genel bilgi

Aşağa gitmek

Aritmetik Operatörler hakkında genel bilgi

Mesaj  Admin Bir Perş. Ağus. 19, 2010 6:13 am

4.1 Aritmetik Operatörler
4.1.1 – operatörü

- operatörü tamsayı veya ondalık sayı tipinde tek operand alır. Yaptığı iş verilen operandın işaretini değiştirmektir. Bu operatör çıkartma operatörü ile karıştırılmamalıdır. Kullanılan işaret aynı olsa da yapılan işlem farklıdır. Örneğin;

j = 3 – -x;

işlemi

j = 3 -(-x);
olarak değerlendirilir.
4.1.2 Aritmetik işlem ve atama operatörleri

Aritmetik işlem operatörleri matemetikte kullandıklarımızın aynısıdır. C’de bu işlemlere bir ek olarak % operatörü gelmiştir. Bu operatörleri sayacak olursak:

+ Toplama
- Çıkartma
* Çarpma
/ Bölme
% Kalan

Bu operatörlerden *, / ve % çarpma sınıfı operatörler, + ve – ise toplama sınıfı operatörler olarak adlandırılır. Çarpma sınıfının toplama sınıfıan göre önceliği vardır. Bu operatörler tamsayı veya ondalık sayıları operand olarak kabul ederler ve yapılan işlemlerdeki çıkış tipleri alınan operandlara bağlıdır. (Örnek tablosu)

% operatörü diğer aritmetik operatörlerin aksien sadece tamsayı kabul eder. İşlemin sonucu ilk operandın ikinci operanda bölümünden kalan sayıdır. Bu aynı zamanda mod alma işlemidir. Örneğin;

9 % 5 = 4

Aritmetik atama operatörleri, önceki örneklerde de kullandığımız aritmetik işlem ile atama işlemini birarada yapar.

= Ata
+= Topla ve ata
-= Çıkar ve ata
*= Çarp ve ata
/= Böl ve ata
%= Kalanı hesapla ve ata

C’de atama operatörünün diğer programlama dillerinde farklı bir kullanımı vardır. Birden fazla değişkene aynı anda aynı değeri atama işlemini gerçekleştirmeye izin verir. Örneğin;

a = b = c = d = 1;

Burada öcne d’ye, sonra c’ye ev sonra da sırasıyla b ve a’ya değer atanır.

int j; double f; f = j = 3.5;

işlemi (ne yapar?) önce j’ye 3 sonra da f’e 3 atar. Bu aslında bir yazım hatasından kaynaklanır. Aşağıdaki kod parçası ise f’e 3.5, j’ye 3 atar:

int j; double f; f = j = 3.5;

Aritmetik atama operatörleri ise kod yazımını kolaylaştırmak için kullanılmaktadır. Bu operatörlerin yaptıkları işlemler aslında şöyledir:

a += b à a= a + b
a -= b à a= a – b
a *= b à a= a * b
a /= b à a= a / b
a %= b à a= a % b

Burada b bir sayı da olabilir, bir aritmetik veya lojik ifade de olabilir fakat a her zaman bir değişken olmak zorundadır. (Örnek tablosu)
4.1.3 Artırma ve azaltma operatörleri

Aritmetik atama operatörleri gib iartırma ve azaltma operatörleri de C’de kullanım kolaylığı için yeralmaktadır. Artırma oepratörü değişkenin değerini 1 artırmak, azaltma oepratörü de değişkenin değerini 1 azaltmak içi kulanılır. Her iki operatörün de 2 tipi vardır: prefix – yani değişkenin önünce kullanılan ve postfix – değişken adından sonra kullanılan. Her iki tip operatör de aynı işlemi gerçekleştirir ama kullanım yerlerine hangi tip operatörün kullanıldığı önem kazanır:

a++ postfix artırma op.
a– postfix azalta op.
++a prefix artırma op.
–a prefix azatma op.

Postfix ve prefix tipteki operatörlerin yaptıkları işler arasındaki farkı açıklarsak:

Postfix operatörler, üzeridne işlem yapacakları değişkenin değerini alığ hafızada bir yere yerleştirirler. Compiler daha sonra işleme göre değişkenin değerini artırır ya da azaltır. Eğer bu operatör bir işlemde kullanılıyorsa, işlem içinde, değişkenin değeri oalrak, içeriği artırılmadan önce geçici hafızaya alınan değer kullanılır. Örneğin;

int j=5, k=5;
printf(“j: %d\t k: %d\n”, j++, k--);
printf(“j: %d\t k: %d\n”, j, k);

Bu kod parçası sonucu ekranda göreceğimiz satırlar;j: 5 k: 5
j: 4 k: 6

Görüldüğü gibi compiler j ve k’nın değerini ekrana yazdırdıktan sorna değiştirmiştir. Eğer aynı kod parçasını prefix operatörlerle yazacak olursak;

int j=5, k=5;
printf(“j: %d\t k: %d\n”, j++, k--);
printf(“j: %d\t k: %d\n”, j, k);

ve ekranda göreceğimiz satırlarj: 4 k: 6
j: 4 k: 6

Genelde postfix ve prefix operatör kullanımının sonucu aynı olduğundan bu operatörlerin kullanıldığı karmaşık ifadelerde dikkatli olmak gerekir.
4.2 Bağıntı Operatörleri

Bu tip operatörler daha çok akış kontrolündeki koşulalrda kullanılmaktadır. Ayrıca bu operatörlerin hepsi matematikte kullanılan ifadeler ile aynıdır.

> Büyüktür
< Küçüktür
>= Büyük eşit
<= Küçük eşit
== Eşit
!= Eşit değil

Aritmetik operatörlerin her zaman bağıntı operatörlerine göre üstünlüğü vardır. Örneğin;

a + b * c < d / f

ifadesinin karşılığı

(a + (b * c)) < (d / f)
4.3 Lojik Operatörler

Lojik – mantıksal operatöerl birden fazla bağıntı operatörü veya koşul sonucunu birarada değerlendirebilmek için kullanılır. Birden fazla koşulu birarada değerlendirmek için AND veya Or işlemi kullanılırken, bir koşulun tersini almak için de NOT operatörü kullanılır:

&& AND
|| OR
! NOT

AND operatörü aldığı her iki operand da TRUE olmadıkça FALSE, her ikisi de TRUE ise TRUE döndürür. OR operatörü ise aldığı her iki operand da FALSE olmadıkça TRUE, her ikisi de FALSE ise FALSE döndürür. C’de 0’dan farklı herdeğer TRUE kabul edildiğinden, AND veya OR operatörüne tamsayı değerler de verilse, sonuç TRUE ise bu 1’e denk düşer. (Örnek tablosu)
4.4 Bit seviyesinde işlemler

Bit seviyesinde işlemler programcıya istediği değişkene bit seviyesinde erişimini, bitler üzerinde işlem yapabilmesini sağlar. Bu operatörler:

>> Sağa shift
<< Sola shift
& AND
| OR
^ XOR
~ Sayının tersi

Bit seviyesinde işlem yapan operatörler iki gruba ayrılır. Shift operatörleri (<< ve >>) ve lojik operatörler (&, | ve ^).
4.4.1 Shift operatörleri

Shift operatörleri, istenilen değişkenin bitlerini, sağa veya sola, istenilen miktarda kaydırmak için kulanılır.Örneğin;

5 << 1 00000000 00000101 à 00000000 00001010 10
255 >> 3 00000000 11111111 à 00000000 00011111 31
8 << 10 00000000 00001000 à 00100000 00000000 213
1 << 15 00000000 00000001 à 10000000 00000000 -215

Örneklerden de anlaşılacağı gibi her sola shift işlemi sayının 2 ile çarpılmasına, her sağa shift ise sayının 2’ye bölünmesine yol açmaktadır. Dikkat edilirse sayı sağa vye sola shift edilirken sayıya yeni eklenen bilerin değerleri hep 0 olmakta. Bu kural sadece pozitif sayılar için geçerli. Negatif sayılar için yeni gelen bitlerin değerleri 0 veya 1 olabilir – bu uygulamaya bağlıdır. Örneğin;

-5 >> 2 11111111 11111011 à 00111111 11111110 213-1

Bazı uygulamalar bu işlemi yaparkan bazıları da shift işlemini ağaşıdaki gibi gerçekleştirir:

-5 >> 2 11111111 11111011 à 11111111 11111110 -2

Birinci uygulama – yeni bitlerin 0 değerini aldığı – lojik shift olarak adlandırılırken, yeni bitlerin 1 değerini aldığı ikinci uygulama aritmetik shift olarak adlandırılır.
4.4.2 Lojik operatörler

Lojik bit operatörleri, önceden anlatılan lojik operatörlerine benzer fakat farkı bu işlemlerin işleme giren her bit için ayrı ayrı yapılmasıdır. Örneğin && (lojik AND) işlemi iki değeri AND’lerken, bit bazında kullanılan & (AND) işlemi operand verilen iki değişkenin birbirine denk düşen her bit çiftini ayrı ayrı AND’ler. Örneğin;

int A=9430, B=5722;

iken

A && B = 1 (TRUE)

sonucunu verirken

A à 00100100 11010110
B à 00010110 01011010
A & B à 00000100 01010010 = 1106 sonucunu verir.

İşlemden anlaşılabileceği gibi & işlemi her bit için aynı işlemi yapar ve sonucu da gene bir sayı olarak saklar. Birt bazındaki | (OR) işlemi de her den düşen her biti OR işlemine sokar ve sonucu bir değişkende saklar.

A à 00100100 11010110
B à 00010110 01011010
A & B à 00110110 11011110 = 15046 sonucunu verir.

^ (XOR) işlemi her biti karşılaştırır – iki bitin değeri de aynı ise sonuçta denk gelen bite 0, farklı ise 1 atar:

A à 00100100 11010110
B à 00010110 01011010
A ^ B à 00110010 10001100 = 13940 sonucunu verir.

~ operatörü de verilen sayıdaki her bitin tersini alır:

A à 00100100 11010110
~ A à 11011011 00101001 sonucunu verir.

C’de bitler ve bitler üzerindeki işlemler genelde masking adı verilen bir teknik için kullanılır. Masking tekniği, bir değişkenin bitlerine belli anlamlar atama şeklinde gerçekleştirilir. Örneğin, 32 saoruluk bir test olduğu ve bu testteki cevapların ‘Evet’ ya da ‘Hayır’ olduğu varsayılırsa, bir kullanıcının girtdiği bütün cevaplar tek bir long int değişkeninde tutulabilir:

long answers = 0;
int j;
char c;
for (j=0; j<32; j++)
{
scanf(“%c”, &c);
if (c == ‘e’ || c == ‘E’)
answers |= 1 << j;
}

Girilen her e veya E cevabı için önce 1 << j işlemi ile, içeriği 1 olan bit cevap verilen sorunun pozisyonuna getirilir ve bu değer answers değişkeni ile Orlanarak answers değişkeninde o soruya denk gelen bite 1 değeri yazılır. Örneğin j=4 iken, yani 5. sorunun cevabı giriliyor iken;1 << 4 = 00000000 00000000 00000000 00010000

olur ve bu da answers değişkeni ile Orlandığında answers’ın 5. biti 1 değierini alır. Doğru cevapların da long int tipinde bir değişkende tutulduğunu düşünürsek, answers ile bu değişkeni XOR’ladığımızda elimizde yanlış cevap verilen soruların bitlerinde 1 olan bir değişken olur.

answers = 10110101 10001110 10111010 10001001
correcta = 10010100 11001010 10010010 10011000

^ = 00100001 01000100 00101000 00010001

Yeni oluşan değişkendeki 1’leri sayacak bir fonksiyon yazılırsa yanlış cevap sayısını elde etmiş oluruz:

result = answers ^ correcta;
for (j=0; j<32; j++)
{
if (result & 1)
wrong++;
result>>1;
}
4.4.3 Atama operatörleri

Bit bazında atama oepratörleri ile aritmetij/lojik atama operatörlerinin çalışması aynıdır:

>>= Sağa shift et, ata
<<= Sola shift et, ata
&= ANDle, ata
|= ORla, ata
^= XORla, ata
4.5 Koşul operatörü (? : )

?: operatörü çok basit bir if … else ifadesinin kısatlılmış halidir:

if (x < y)
z = x;
else
z = y;

ifadesi ?: operatörü ile

z = ((x < y) ? x : y)

avatar
Admin
Admin

Mesaj Sayısı : 102
Kayıt tarihi : 18/08/10
Yaş : 29

Kullanıcı profilini gör http://programlama.yetkin-forum.com

Sayfa başına dön Aşağa gitmek

Sayfa başına dön

- Similar topics

 
Bu forumun müsaadesi var:
Bu forumdaki mesajlara cevap veremezsiniz