Operatörler Ne Yapar
Operatör, operand adı verilen bir veya daha fazla değer üzerinde bir işlem gerçekleştiren bir semboldür. Aslında zaten birini kullanıyordun: bir değeri bir değişkene bağlayan =. C++ matematik, karşılaştırma, mantık ve bit işlemleri için zengin bir operatör seti ile gelir - ve yeni başlayanları tökezleten birkaç keskin köşeyle birlikte.
Önceki sayfada const'un bir değeri nasıl kilitlediğini gördün. Operatörler ise, sabit olsun ya da olmasın, sakladığın değerleri hesapladığın araçlardır. Her gün kullanacağın aileleri tek tek inceleyelim.
Aritmetik Operatörler
Beş aritmetik operatör şunlardır: +, -, *, / ve % (mod, bir bölmenin kalanı):
Büyük tuzak işte o bölümde yaşıyor. 17 / 5, 3.4 değil 3 yazdırır. Her iki operand da tam sayı olduğunda, / tam sayı bölmesi yapar ve kesirli kısmı atar - sıfıra doğru kırpar, yuvarlamaz. Gerçek bir kesir istiyorsan en az bir operand kayan noktalı olmalıdır:
% operatörü yalnızca tam sayılarla çalışır. Bir double üzerinde % kullanmak derleme hatasıdır - kayan noktalı kalanlar için <cmath> içindeki std::fmod kullan.
Atama ve Bileşik Operatörler
Tek bir = atama yapar; karşılaştırma yapmaz. C++ sana, değişken adını tekrarlamamak için bir işlemi atama ile birleştiren bileşik biçimler sunar:
Klasik ve can sıkıcı bir hata, bir koşulun içinde == demek isterken = yazmaktır. if (x = 0), karşılaştırma yapmak yerine x'e 0 atar ve ardından sonucu (yanlış olan) test eder. Modern derleyiciler uyarıları açtığında bu konuda seni uyarır - -Wall'ı açık tut ve uyarıyı ciddiye al.
Karşılaştırma Operatörleri
Karşılaştırma operatörleri evet/hayır sorusu sorar ve bir bool (true veya false) üretir:
Varsayılan olarak cout bir bool değerini 1 veya 0 olarak yazdırır. boolalpha'yı bir kez akışa ekle, o akışın geri kalanında true/false sözcüklerine geçer.
İnce bir tuzak: 1 < x < 10 gibi karşılaştırmaları zincirleme. Bu, (1 < x) < 10 olarak ayrıştırılır - ilk karşılaştırma bir bool (0 veya 1) üretir, ardından bu 10 ile karşılaştırılır, dolayısıyla tüm ifade neredeyse her zaman true olur. Bunun yerine 1 < x && x < 10 yaz.
Mantıksal Operatörler ve Kısa Devre
&& (ve), || (veya) ve ! (değil) mantıksal ifadeleri birleştirir. İlk ikisi kısa devre yapar: sonuç belli olur olmaz değerlendirme durur.
Ne check("A") ne de check("B") hiçbir zaman çalışır - işte bu kısa devredir. Bu yalnızca bir optimizasyon değil; bir araçtır. if (ptr != nullptr && ptr->ready) ifadesini güvenle yazabilirsin çünkü ptr->ready kısmına yalnızca ptr boş değilken ulaşılır, böylece sallantıdaki bir işaretçiye erişim önlenir.
Artırma ve Azaltma
++ bir ekler; -- bir çıkarır. Her birinin bir ön ek ve bir son ek biçimi vardır ve sonucu kullandığında fark önem kazanır:
Yalnızca yan etkiyi istediğinde (örneğin bir for döngüsünde) ++i'yi tercih et. Düz bir int için aynıdır, ama yineleyiciler gibi daha ağır türlerde son artırma önce eski değeri kopyalamak zorundadır ki bu boşa harcanan bir iştir.
Bir uyarı daha: aynı değişkeni tek bir ifade içinde iki kez değiştirme, örneğin i = i++ + 1; veya arr[i] = i++;. Bu güncellemelerin sırası belirsizdir ve sonuç tanımsız davranıştır. Her değişkeni ifade başına tek bir değişiklikle sınırla.
Bit Düzeyi Operatörler ve Öncelik
Düşük seviyeli işler için bit düzeyi operatörler vardır: & (ve), | (veya), ^ (xor), ~ (değil) ve kaydırma operatörleri << ile >>.
Dikkat: << ve >> aynı zamanda cout üzerindeki akış operatörleridir. Bir cout satırının içinde, bir bit kaydırması etrafında genellikle parantez gerekir, aksi takdirde derleyici bunu bir akışa ekleme olarak okur.
Son olarak, öncelik, operatörleri karıştırdığında neyin önce bağlanacağına karar verir. Tıpkı matematikteki gibi * ve /, + ve -'den daha sıkı bağlanır, bu yüzden 2 + 3 * 4, 14'tür. Karşılaştırma aritmetikten daha gevşek, mantıksal &&/|| ise daha da gevşek bağlanır. Tereddütteysen tüm tabloyu ezberleme - parantez ekle. (a + b) * c, okuyucunun kuralları hatırlamasına güvenmekten daha açıktır.
Sıradaki: Tür Dönüştürme
Yukarıda (double)a / b ifadesinin bir tam sayıyı kayan noktalı bir bölmeye zorladığını gördün. İşte bu bir dönüştürmedir (cast) - bir değeri kasıtlı olarak bir türden başka bir türe çevirmek. Sonraki sayfada, örtük yükseltmelerden static_cast'e kadar C++'ın dönüştürme araçlarını ve her birinin ne zaman güvenli olduğunu ele alacağız.
Sıkça Sorulan Sorular
C++ içindeki operatörler nelerdir?
C++ operatörleri aritmetik (+ - * / %), karşılaştırma (== != < > <= >=), mantıksal (&& || !), atama (= += -= ...), artırma/azaltma (++ --) ve bit düzeyi (& | ^ ~ << >>) olarak gruplar. Ayrıca üçlü ?: operatörü ve sizeof gibi birkaç tane daha vardır.
C++ içinde 5 / 2 neden 2'ye eşittir?
Çünkü her iki operand da int olduğundan / tam sayı bölmesi yapar ve kesirli kısım atılır - yuvarlanmaz. 2.5 elde etmek için en az bir operandı kayan noktalı bir değer yap: 5.0 / 2 veya 5 / 2.0.
C++ içinde ++i ile i++ arasındaki fark nedir?
Her ikisi de i'ye 1 ekler. ++i (ön artırma) önce artırır ve yeni değeri verir; i++ (son artırma) eski değeri verir, sonra artırır. Yalnızca yan etki ile ilgileniyorsan ++i'yi tercih et.