Artimetik, TDK’ya göre "Matematiğin, konusu sayılar, bunların özellikleri ve işlemler olan kolu."[1] olarak tanımlanmaktadır. Günlük işlerde basit hesaplar için aritmetik kullanırız. Bilgisayarlar da temelde bu işlemleri yerine getirmek için ortaya çıkmış makinelerdir. Daha sonra daha karmaşık işlemleri yapabilecek hale gelseler de temelde basit aritmetik işlemleri kullanarak bunları başarmaktadırlar. Programlama dillerinde matematiksel işlemleri öyle kağıda yazar gibi yapamayız. Her şeyde olduğu gibi bunun da bir söz dizimi vardır.
Öncelikle sıradan denklemleri kağıt üzerine nasıl yazdığımızı inceleyelim. Aşağıdaki denklemlerde kullanılan a, b ve c birer değişken olmak üzere, denklemler günlük hayatta şu şekillerde yazılabilir:
a = 4b + c
c = 30 \times c – a
b = \frac{c}{a}
Burada gördüğünüz gibi bölme işlemleri kesir çizgisi ile gösterilirken, çarpma işlemleri \times işareti ile veya hiçbir işaret koymadan yazılabilmektedir. Elbette bilgisayarlar bu işlemleri bu şekilde algılayamazlar. Zaten düz bir metin editörüne bu sembolleri yerleştirmek de çoğu zaman olanaksız olur. Şimdi de yukarıdaki işlemlerin aynısını bilgisayarda nasıl gösterebileceğimize bakalım:
a = 4 * b + c;
c = 30 * c -a;
b = c / a;
Gördüğünüz gibi çarpma işlemini "*" işareti, bölme işlemini ise "/" işareti temsil ediyor. Toplama ve çıkarma işlemleri yine sırasıyla "+" ve "–" işaretleri ile temsil ediliyor. Peki mod alma işlemini programlamada kısaca yapmanın bir yolu var mıdır? Örneğin şöyle bir işlem olsun:
a = b\mod c
Burada mod alma işlemini normal kağıt üstünde yapar gibi yapmaktayız. Fakat programlama yaparken matematiksel yazımların aynısını yazmak her zaman mümkün olmaz. "%" işareti C programlama dilinde mod alma işlemini temsil eder. Örnek:
a = b % c;
Bu işlem yukarıdaki işlemin aynısını yapmaktadır. C programlama dilinde (ve daha birçok benzer dilde) özel işlemleri yerine getiren özel karakter, karakter dizisi veya kelimelere operatör (operator) adı verilir. Bu operatörlerin işlem yapmak için aldıkları ifade veya değerlere ise terim (operand) adı verilmektedir. C programlama dilinde birçok operatör bulunmaktadır. Bu operatörler bu yazıda bir kısmını göreceğimiz aritmetik ve ileride göreceğimiz mantıksal işlemler başta olmak üzere, pek çok işlemi yerine getirirler. Kimisi de daha özel amaçlar için kullanılmaktadır. C’deki operatörleri incelemeye başlamadan önce ifade kavramından bahsedelim.
C’de İfadeler ve Operatörler
C’de bir veya birden fazla operatör ve onların terimlerinden meydana gelen ve bir çeşit hesaplama belirten yapılara ifade (expression) adı verilmektedir. İfadeler hesaplandıktan sonra bir değer üretebilirler, bir yan etkiye neden olabilirler (girdi ve çıktı işlemleri gibi) veya bir fonksiyon veya nesneye değer atayabilirler. Biz burada şimdilik değer üretmeleri ile ilgileneceğiz.
C’de her bir ifade bir tür (type) ve değer kategorisi (value category) ile karakterize edilmektedir. Tür olayı zaten daha önce değişkenler için açıkladığımız türe benzerdir. C’de her bir ifade şu 3 değer kategorisinden birine ait olabilir:
- Sol taraf değeri (Lvalue)
- Sağ taraf değeri (Non-lvalue, Rvalue)
- Fonksiyon belirten şeyler (Function designators)
Bu kavramların dil genelinde oldukça geniş bir yeri olsa da ilk ikisinden bu yazıda atama operatörünü açıklarken kısaca bahsedeceğim. Üçüncüye ise burada değinmeyeceğim.
İfadeleri oluşturmak için operatörlerin kullanıldığını söylemiştik. Şimdi C’deki operatörlerden biraz daha bahsedelim. C’de operatörler genellikle tek karakter ile belirtilse de ("+", "-", "*" gibi) birden fazla karakterden meydana gelen ("==", ">>=" gibi) veya kelimeler ile ifade edilen ("sizeof" gibi) operatörler de bulunmaktadır. C’de operatörler alabildiği terim sayısına göre 3 kategoriye ayrılabilmektedir:
- Tek terimli operatörler (Unary operators)
- Çift terimli operatörler (Binary operators)
- Üç terimli operatörler (Ternary operators)
Aynı operatör aldığı terim sayısına göre farklı anlamlara gelebilmektedir. Örneğin "-" operatörünün tek terimli ve çift terimli versiyonları farklı anlamlara gelmektedir. Tek terimli operatörler sağ veya sol taraflarına tek bir terim alıp onunla işlem yapabilirler. Çift terimli operatörler ise her iki tarafına da bir terim alıp işlem yapabilirler. C’de üç terimli operatör olan tek operator koşul operatörüdür. Bunu da ileride ayrıntılı olarak inceleyeceğiz.
C’de operatörleri aldıkları terim sayısına göre gruplandırmanın dışında çok farklı şekillerde gruplandırmak da mümkündür. Şimdi burada C’de bulunan operatörleri, onların isimlerini ve terim sayılarını belli gruplara göre özetleyelim:
| Atama Operatörleri | |||
|---|---|---|---|
| Operatör | Operatör Adı | Terim Sayısı | Örnek |
| = | Atama Operatörü | Çift Terimli | a = b |
| += | Toplayarak Atama Operatörü | Çift Terimli | a += b |
| -= | Çıkararak Atama Operatörü | Çift Terimli | a -= b |
| *= | Çarparak Atama Operatörü | Çift Terimli | a *= b |
| /= | Bölerek Atama Operatörü | Çift Terimli | a /= b |
| %= | Mod Alarak Atama Operatörü | Çift Terimli | a %= b |
| &= | Bitsel VE ile Atama Operatörü | Çift Terimli | a &= b |
| |= | Bitsel VEYA ile Atama Operatörü | Çift Terimli | a |= b |
| ^= | Bitsel ÖZEL VEYA ile Atama Operatörü | Çift Terimli | a ^= b |
| <<= | Bitsel Sola Kaydırarak Atama Operatörü | Çift Terimli | a <<= b |
| >>= | Bitsel Sağa Kaydırarak Atama Operatörü | Çift Terimli | a >>= b |
| Artırma/Azaltma Operatörleri | |||
| Operatör | Operatör Adı | Terim Sayısı | Örnek |
| ++(ifade) | Önceden Artırma Operatörü | Tek Terimli | ++a |
| −−(ifade) | Önceden Azaltma Operatörü | Tek Terimli | −−a |
| (ifade)++ | Sonradan Artırma Operatörü | Tek Terimli | a++ |
| (ifade)−− | Sonradan Azaltma Operatörü | Tek Terimli | a−− |
| Aritmetik Operatörler | |||
| Operatör | Operatör Adı | Terim Sayısı | Örnek |
| + | Artı Operatörü | Tek Terimli | +a |
| – | Eksi Operatörü | Tek Terimli | -a |
| + | Toplama Operatörü | Çift Terimli | a + b |
| – | Çıkarma Operatörü | Çift Terimli | a – b |
| * | Çarpma Operatörü | Çift Terimli | a * b |
| / | Bölme Operatörü | Çift Terimli | a / b |
| % | Mod Alma Operatörü | Çift Terimli | a % b |
| ~ | Bitsel DEĞİL Operatörü | Tek Terimli | ~a |
| & | Bitsel VE Operatörü | Çift Terimli | a & b |
| | | Bitsel VEYA Operatörü | Çift Terimli | a | b |
| ^ | Bitsel ÖZEL VEYA Operatörü | Çift Terimli | a ^ b |
| << | Bitsel Sola Kaydırma Operatörü | Çift Terimli | a << b |
| >> | Bitsel Sağa Kaydırma Operatörü | Çift Terimli | a >> b |
| Mantıksal Operatörler | |||
| Operatör | Operatör Adı | Terim Sayısı | Örnek |
| ! | Mantıksal DEĞİL Operatörü | Tek Terimli | !a |
| && | Mantıksal VE Operatörü | Çift Terimli | a && b |
| || | Mantıksal VEYA Operatörü | Çift Terimli | a || b |
| Karşılaştırma Operatörleri | |||
| Operatör | Operatör Adı | Terim Sayısı | Örnek |
| == | Eşittir Operatörü | Çift Terimli | a == b |
| != | Eşit Değildir Operatörü | Çift Terimli | a != b |
| < | Küçüktür Operatörü | Çift Terimli | a < b |
| > | Büyüktür Operatörü | Çift Terimli | a > b |
| <= | Küçük veya Eşittir Operatörü | Çift Terimli | a <= b |
| >= | Büyük veya Eşittir Operatörü | Çift Terimli | a >= b |
| Üye Erişim Operatörleri | |||
| Operatör | Operatör Adı | Terim Sayısı | Örnek |
| [] | İndis Operatörü | Çift Terimli | a[b] |
| * | Dolaylı Erişim Operatörü | Tek Terimli | *a |
| & | Adres Alma Operatörü | Tek Terimli | &a |
| . | Üye Erişim Operatörü | Çift Terimli | a.b |
| -> | Gösterici Yoluyla Üye Erişim Operatörü | Çift Terimli | a->b |
| Diğer Operatörler | |||
| Operatör | Operatör Adı | Terim Sayısı | Örnek |
| (…) | Fonksiyon Çağırma Operatörü | Çift Terimli | f(…) |
| , | Virgül Operatörü | Çift Terimli | a, b |
| (tür)ifade | Tür Dönüştürme Operatörü | Tek Terimli | (int)a |
| ?: | Koşul Operatörü | Üç Terimli | a ? b : c |
| sizeof | sizeof Operatörü | Tek Terimli | sizeof(a) |
| _Alignof | _Alignof Operatörü (C11) | Tek Terimli | _Alignof(int) |
| typeof | typeof Operatörü (C23) | Tek Terimli | typeof(a) |
| typeof_unqual | typeof_unqual Operatörü (C23) | Tek Terimli | typeof_unqual(a) |
Burada yine küçük bir not düşmekte fayda var: C23 standartları ile _Alignof operatörünün adı alignof olarak değişecek ve dile typeof ile typeof_unqual operatörleri eklenecektir. Biz bu yazıda bu operatörlerden sadece basit atama operatörünü ve aritmetik operatörleri inceleyeceğiz. Aritmetik bitsel operatörleri ise daha sonraki yazılarda ele alacağız.
Aritmetik Operatörler
C’de temel aritmetik işlemleri yapmak için kullanılan operatörlere aritmetik operatörler (arithmetic operators) adı verilmektedir. Bu operatörleri yine kendi içinde gruplara ayırmak mümkündür:
- Tek terimli aritmetik operatörler (Unary arithmetic operators)
- Toplamayla ilgili operatörler (Additive operators)
- Çarpmayla ilgili operatörler (Multiplicative operators)
- Bitsel mantık operatörleri (Bitwise logic operators)
- Kaydırma operatörleri (Shift operators)
Bitsel mantık ve kaydırma operatörlerini burada incelemeyeceğiz. Öncelikle tek terimli aritmetik operatörlerden başlayalım. Tek terimli "+" ve "-" operatörleri bu operatör grubuna girmektedir. Örnekler:
int a = +5; // a = 5
int b = -4; // b = -4
int c = -a; // c = -5
int d = +b; // d = -4
Yukarıdaki örnekte 4 tam sayı değişkenine ilk değerler verilmiştir. Burada değişmezin yanında yer alan "+" operatörüne tek terimli artı operatörü (unary plus operator) adı verilirken, "-" operatörüne ise tek terimli eksi operatörü (unary minus operator) adı verilmektedir. "+" operatörü uygulandığı ifadenin sonuç değerinden ziyade, onun türünü yükseltme (promotion) ile ilgili işlem yapar ve genelde bu operatöre çok fazla ihtiyaç duymayız. Tür yükseltme konusu da bu yazının kapsamı dışındadır. "-" operatörü ise tam sayı yükseltmesi uyguladıktan sonra, değer veya ifadeyi negatif haline çevirir.
Toplama ile ilgili operatörler ise çift terimli "+" ve "-" operatörleridir. Çift terimli "+" operatörüne toplama operatörü (addition operator) adı verilir ve sağ ve sol tarafında yer alan ifadeleri aritmetik olarak toplar. Çift terimli "-" operatörüne ise çıkarma operatörü (subtraction operator) adı verilir ve sağ ve sol tarafında yer alan ifadeleri aritmetik olarak birbirinden çıkarır. Bu iki operatörün aritmetik kullanımlarının dışında gösterici aritmetiğinde (pointer arithmetic) de kullanımları bulunsa da bu kullanım bu yazının kapsamı dışındadır. Her iki tarafında da aritmetik ifadenin olduğunu varsayarak şu şekilde örnekler verebiliriz:
int a = 5; // a = 5
int b = 4; // b = 4
int c = a + b; // c = 9
int d = a - b; // d = 1
int e = a - b + c - d; // e = 9
Gördüğünüz gibi bu operatörler sıradan toplama ve çıkarma işlemlerini yerine getirmektedirler. Ancak son örnek biraz kafanızı karıştırmış olabilir. C’de aynı ifade içerisinde kullanılan operatörlerin birbirlerine göre üstünlük durumları ve işlem yönleri bulunmaktadır. C’de ve birçok benzer programlama dilinde operatörlerin birbirlerine olan üstünlüklerine operatör önceliği (operator precedence) adı verilmektedir. Bazen aynı öncelik sırasına sahip operatörler (yukarıdaki örnekteki gibi) art arda kullanılabilirler. İşte bu tip bir kullanımda, işlem önceliğinin sağdan sola mı yoksa soldan sağa mı olduğunu belirten kurala da birleşme kuralı (associativity rule) adı verilmektedir.
Peki yukarıdaki son örneğin sonucu nasıl 9 çıktı? Toplama ile ilgili aritmetik operatörlerin operatör öncelikleri birbirlerine eşittir. Ayrıca birleşme kuralına göre de işlem yönü soldan sağadır. Bu nedenle önce a + b işlemi gerçekleşmiş, buradan çıkan sonuç c ile toplanmış ve buradan çıkan sonuçtan da d çıkarılmıştır. İşte bu şekilde e değişkenine 9 ilk değeri verilmiştir. Operatör önceliği ve birleşme kuralı konusuna birazdan daha ayrıntılı değineceğim.
Şimdi de çarpma ile ilgili operatörleri inceleyelim. C’de çarpma ile ilgili operatörler "*", "/" ve "%" operatörleridir. "*" operatörüne çarpma operatörü (multiplication operator) adı verilir ve iki aritmetik ifadeyi çarpar. "/" operatörüne bölme operatörü (division operator) denir ve soldaki ifadeyi sağdakine böler. "%" operatörüne ise mod alma veya kalan operatörü (remainder operator) adı verilir ve soldaki ifadenin sağdaki ifadeye bölümünden kalanı bulur. Bu ifadelerle ilgili şu şekilde örnekler verebiliriz:
int a = 20; // a = 20
int b = 5; // b = 5
int c = a * b; // c = 100
int d = a / b; // d = 4
int e = a % b; // e = 0
int f = c / 10 % 3; // f = 1
Son örneğe kadar her şeyin net olduğunu düşünüyorum. Aslında son örnek de yine az önceki toplamayla ilgili operatörlerde yer alan örnekle benzer bir durumu paylaşır. Çarpmayla ilgili operatörlerin operatör öncelikleri aynıdır. İşlem öncelik yönleri ise yine soldan sağa doğrudur. Bu nedenle son örnekte değeri 100 olan c değişkeni önce 10 ile bölünmüş ve çıkan 10 sonucu 3 ile mod alma işlemine sokulmuştur. Sonuç olarak ise 1 sonucu elde edilmiştir. Şimdi gördüğümüz tüm bu operatörlerin öncelikleri, birleşme özellikleri ve öncelik kaydırmaları ile ilgili konuşalım.
Parantez Operatörü ve Aritmetik Operatörlerin Öncelikleri
Parantez operatörü C standartlarının sadece bir yerinde gruplama operatörü (grouping operator) olarak isimlendirilse de aslında tam bir operatör olma özelliği taşımaz. C’de ifadelerde parantez kullanımı, kullanılan yerin önceliğini artırmaktadır. Bu aynı matematikteki parantez kullanımına benzer. Örneğin 3 - 2 * 5 ile (3 - 2) * 5 ifadelerinin aynı sonucu vermemesi gibi… Sonuç olarak C’de parantezlerin bu amaçla kullanımına bir operatör dememizde bir sakınca yoktur. Onu bir operatör olarak değerlendirdiğimizde ise kendisi en yüksek önceliğe sahip operatör olur. Zaten kullanım amacı da yapılan işlemlerde önceliklendirmedir. Şimdi birkaç parantez kullanım örneği verelim:
int a = 18; // a = 18
int b = 6; // b = 6
int c = 2; // c = 2
int d = a - b + c; // d = 14
int e = a - (b + c); // e = 10
int f = a / (6 % 4); // f = 9
Yukarıdaki örnekte e değişkenine ilk değer verilme sırasında normalde soldan sağa bir işlem yapılacakken, parantez operatörü ile önce en son terim hesaplanmış, daha sonra da çıkan sonuç a değişkeninin değerinden çıkartılmıştır. Yine f örneğinde önce mod alma işlemi yapılmış, daha sonra da bölme işlemi yapılmıştır. İşte parantez operatörü bu şekilde işlemleri önceliklendirebilir. Aslında C’de operatör öncelikleri birbirine karışabileceğinden, önemli hesaplamalarda parantez kullanımı da oldukça önemli bir konu haline gelir.
Şu ana kadar gördüğümüz tüm operatörler ile birazdan göreceğimiz atama operatörünü önceliklerine göre sıralayıp işlem yönlerini de şu şekilde bir tabloda özetleyelim:
| Operatör Önceliği | Operatör | Operatör Adı | Öncelik Yönü (Associativity) |
|---|---|---|---|
| 1 | () | Parantez Operatörü | Soldan Sağa |
| 2 | + | Tek Terimli Artı Operatörü | Sağdan Sola |
| 2 | – | Tek Terimli Eksi Operatörü | Sağdan Sola |
| 3 | * | Çarpma Operatörü | Soldan Sağa |
| 3 | / | Bölme Operatörü | Soldan Sağa |
| 3 | % | Kalan Operatörü | Soldan Sağa |
| 4 | + | Toplama Operatörü | Soldan Sağa |
| 4 | – | Çıkarma Operatörü | Soldan Sağa |
| 5 | = | Atama Operatörü | Sağdan Sola |
Yeni operatörler öğrendikçe bu tablo da güncellenecektir. Son olarak karmaşık bir örnek verip öncelik konusunu kapatalım:
int w = x * y + -z % z - (x / y - -1) + +y; // w = 52
İşlemleri şu şekilde adım adım ilerleterek sonuca ulaşabilirsiniz:
// Adım 1:
w = x * y + -z % z - (2 - -1) + +y;
// Adım 2:
w = x * y + -z % z - 3 + +y;
// Adım 3:
w = x * y + -6 % z - 3 + 5;
// Adım 4:
w = 50 + -6 % z - 3 + 5;
// Adım 5:
w = 50 + 0 - 3 + 5;
// Adım 6:
w = 47 + 5;
// Adım 7:
w = 52;
Siz de çeşitli şekillerde örnekler yaparak bu operatörlerin kullanımlarını, birbirlerine göre önceliklerini ve işlem yönlerini daha iyi anlayabilirsiniz. Ancak benim tavsiyem bu gibi çok karmaşık işlemlerde parantez kullanarak okunabilirliği artırmaktır.
Atama Operatörü
C dilinde belki de en sık kullanılan operatörlerden biri olan atama operatörü (asssignment operator) veya diğer adıyla basit atama operatörü (simple assignment operator), sağ tarafındaki ifadenin değerini sol tarafında yer alan ifadeye atamaya yarayan ve "=" karakteri ile temsil edilen bir operatördür. Bu operatörü aslında şimdiye kadarki C ile ilgili yazılarımın neredeyse tamamında kullandım. Bu operatör genellikle değişkenlere ilk değer vermek veya onların değerlerini değiştirmek için kullanılmaktadır.
Atama operatörü C dilinde neredeyse en son önceliğe sahip olan operatörlerden biridir (virgül operatörünün önceliği ondan da düşüktür). Bu nedenle genellikle atama işlemi gerçekleşmeden önce terimlerinde yer alan ifadelerin hesaplamaları yapılır. Bir de atama operatörünün işlem yönü sağdan sola doğrudur. Yani birden fazla atama operatörünün aynı satırda kullanılmasında soldan sağa değil, sağdan sola işlem yapılır. Şimdi birkaç örneği inceleyelim:
#include <stdio.h>
int main()
{
int a = 1; // a = 1
int b = a + 1; // b = 2
int c = -5; // c = -5
a = b = 5; // a = 5, b = 5
c = a + b; // c = 10
printf("%d, %d, %d", a, b, c);
return 0;
}
Yukarıdaki örnekte a, b ve c değişkenlerine ilk değerler verilmiştir. Daha sonra a = b = 5 ifadesi ile önce b değişkenine 5 değeri atanmış, daha sonra da a değişkenine b değişkeninin değeri olan 5 değeri atanmıştır. Yani işlemler sağdan sola gerçekleşmiş ve a ile b değişkenlerinin değerleri değiştirilmiştir. Daha sonra da c değişkenine bu iki değişkenin toplamı atanmıştır.
Atama operatöründen bahsederken bir konuya daha açıklık getirmek gerekir. Atama operatörünün sol tarafında yer alan ifadeler nesne belirtmek zorundadır. Değer kategorilerine girmeden önce bu "nesne belirtmenin" ne olduğundan biraz bahsedelim. C’de çalışma zamanında bellek bölgesinde bir yer ve değere sahip olan şeylere nesne (object) adı verilmektedir. Mesela bir önceki yazıda ayrıntılı bir şekilde gördüğümüz tanımlanmış değişkenler bu nesnelere örnektir. C programları bu nesneleri oluşturur, siler, onlara erişir veya onların değerini değiştirir. Nesneler şu özelliklere saiptirler:
- Boyut
- Hizalama gereksinimi
- Depolama süresi
- Ömür
- Efektif tür
- Değer
- Tanımlayıcı (seçeneksel, yani olmak zorunda değil)
Örneğin bir değişkenin boyut, tür, değer ve tanımlayıcı özelliklerini geçen yazıda incelemiştik. Diğerlerine burada ayrıntılı olarak girmeyeceğim. İşte biz aslında void türü dışında herhangi bir türe sahip olan ve nesne belirten ifadelere C’de sol taraf değeri (Lvalue) adını veriyoruz. Daha önce de bu yazıda adı geçen bu değer kategorisi, ismini "=" operatörünün sol tarafına yazılabilen ifadelerden almaktadır. Yani "=" operatörünün sol tarafına bir sol taraf değeri (ifadesi) yazılabilir. Örneğin 5 nesne belirtmeyen bir değişmezdir. Onu C’de şu şekilde kullanmamızın olanağı yoktur:
int x = 7;
5 = x;
Çünkü 5 ifadesinin nesne olarak bellekte bir karşılığı yoktur. x değişkeni ise bellekte yer alan bir sol taraf değeri olduğundan, şu şekilde bir atama mümkündür:
int x = 7;
x = 5;
Peki o zaman 5 gibi veya x + 5 gibi nesne belirtmeyen ifadeler C’de hangi değer kategorisine girer? C’de bu gibi nesne belirtmeyen ifadelere sağ taraf değeri (Rvalue) veya sol taraf olmayan değer (Non-lvalue) adı verilmektedir. Bu değer kategorisine sahip ifadeler "=" operatörnün sol tarafında yer alamazlar. Zaten ismini de bir nevi buradan almaktadırlar. Örneğin x ve y tanımlanmış değişkenler olmak üzere, şu atamaların hepsi geçersizdir:
x + y = 5;
x - 1 = 6;
5 = y;
y * 1 = 6;
Bunların hepsi sağ taraf değeridir. Atama operatörünün sol tarafında mutlaka sol taraf değerleri olmak zorundadır. Fakat sağ tarafında sağ taraf veya sol taraf değerleri bulunabilir. Yani mantık olarak da bellekte yer tutmayan bir değere atama yapmak garip olurdu değil mi? Sol taraf ve sağ taraf değerleri aslında bundan daha karmaşık konular olsa da şimdilik bu kadarını bilmeniz yeterlidir. C++’ın son standartlarında ise durum bunun çok daha ötesindedir ve çok daha fazla değer kategorisi bulunmaktadır (Xvalue gibi).
Bu bölümde operatör ve ifade kavramlarına bir açıklık getirdik ve aritmetik operatörlerin bir kısmını inceledik. Ayrıca bir operatörün önceliğinin ve işlem yönünün ne olduğunu anlatmaya çalıştık. Daha sonra atama operatörünü inceleyip sağ taraf ve sol taraf değerlerinin ne olduğunu açıkladık. Bütün bu bilgilerle ilk üniteyi bitirmiş oluyoruz. Bu ünitedeki amaç temel kavramları öğrenmek ve C programlamaya ufak bir giriş yapmaktı. Bundan sonraki bölümlerde daha çok örnek kod göreceksiniz.


