Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Aşağıdaki işleçler, sayısal tür işlenenleriyle aritmetik işlemler gerçekleştirir:
- Birli
++(artış),--(azaltma),+(artı)ve-(eksi) işleçleri - İkili
*(çarpma),/(bölme),%(kalan),+(toplama)ve-(çıkarma) işleçleri
Tüm integral ve kayan nokta sayısal türleri bu işleçleri destekler.
int, uint, longve ulong türleri tüm bu işleçleri tanımlar. Diğer tam sayı türleri (sbyte, byte, short, ushort, ve char) yalnızca ++ ve -- işleçlerini tanımlar. Diğer işleçler için, byte, veya integral türlerini sbyteişlenen olarak kullanırsanız, değerler türüne int dönüştürülür ve sonuç türü olurint.charushortshort İşlenenler farklı integral veya kayan nokta türleriyse, böyle bir tür varsa, değerleri en yakın içeren türe dönüştürülür. Daha fazla bilgi için C# dil belirtiminin Sayısal yükseltmeler bölümüne bakın.
++ ve -- işleçleri tüm tam sayı ve kayan nokta sayısal türleri ve karakter türü için tanımlanır. Bileşik atama ifadesinin sonuç türü, soldaki işlenenin türüdür.
C# dili başvuru belgesi, C# dilinin en son yayımlanan sürümünü gösterir. Ayrıca, yaklaşan dil sürümü için genel önizlemelerdeki özelliklere yönelik ilk belgeleri içerir.
Belgelerde ilk olarak dilin son üç sürümünde veya geçerli genel önizlemelerde sunulan tüm özellikler tanımlanır.
Tavsiye
Bir özelliğin C# dilinde ilk tanıtıldığı zamanları bulmak için C# dil sürümü geçmişi makalesine bakın.
Artım işleci ++
Birli artış işleci ++ işlenenini 1 artırır. İşlenen bir değişken, özellik erişimi veya dizin oluşturucu erişimi olmalıdır.
Artım işleci iki biçimde desteklenir: sonek artım işleci, x++ve ön ek artım işleci, ++x.
Sonek artırma işleci
sonucux++, aşağıdaki örnekte gösterildiği gibi işlemden önceki değeridir x:
int i = 3;
Console.WriteLine(i); // output: 3
Console.WriteLine(i++); // output: 3
Console.WriteLine(i); // output: 4
Ön ek artım işleci
sonucu++x, aşağıdaki örnekte gösterildiği gibi işlemden sonraki değeridir x:
double a = 1.5;
Console.WriteLine(a); // output: 1.5
Console.WriteLine(++a); // output: 2.5
Console.WriteLine(a); // output: 2.5
Azaltma işleci --
Birli azaltma işleci -- işlenenini 1'e kadar geriler. İşlenen bir değişken, özellik erişimi veya dizin oluşturucu erişimi olmalıdır.
Azaltma işleci iki biçimde kullanılabilir: sonek azaltma işleci, x--ve ön ek azaltma işleci, --x.
Sonek azaltma işleci
sonucux--, aşağıdaki örnekte gösterildiği gibi işlemden önceki değeridir x:
int i = 3;
Console.WriteLine(i); // output: 3
Console.WriteLine(i--); // output: 3
Console.WriteLine(i); // output: 2
Ön ek azaltma işleci
sonucu--x, aşağıdaki örnekte gösterildiği gibi işlemden sonraki değeridir x:
double a = 1.5;
Console.WriteLine(a); // output: 1.5
Console.WriteLine(--a); // output: 0.5
Console.WriteLine(a); // output: 0.5
Birli artı ve eksi işleçleri
Birli + işleç işleneninin değerini döndürür. Birli - işleç, işleneninin sayısal olumsuzlamasını hesaplar.
Console.WriteLine(+4); // output: 4
Console.WriteLine(-4); // output: -4
Console.WriteLine(-(-4)); // output: 4
uint a = 5;
var b = -a;
Console.WriteLine(b); // output: -5
Console.WriteLine(b.GetType()); // output: System.Int64
Console.WriteLine(-double.NaN); // output: NaN
ulong türü birli - işleci desteklemez.
Çarpma işleci *
Çarpma işleci * , işlenenlerinin çarpımını hesaplar:
Console.WriteLine(5 * 2); // output: 10
Console.WriteLine(0.5 * 2.5); // output: 1.25
Console.WriteLine(0.1m * 23.4m); // output: 2.34
Birli * işleç, işaretçi dolaylı işlecidir.
Bölme işleci /
Bölme işleci / , soldaki işlenenini sağ işlenenine böler.
Tamsayı bölme
Tamsayı türlerinin işlenenleri için, işlecin sonucu / bir tamsayı türündedir ve sıfıra yuvarlanmış iki işlenenin bölüme eşittir:
Console.WriteLine(13 / 5); // output: 2
Console.WriteLine(-13 / 5); // output: -2
Console.WriteLine(13 / -5); // output: -2
Console.WriteLine(-13 / -5); // output: 2
İki işlenenin bölümlerini kayan noktalı sayı olarak almak için float, doubleveya decimal yazın:
Console.WriteLine(13 / 5.0); // output: 2.6
int a = 13;
int b = 5;
Console.WriteLine((double)a / b); // output: 2.6
Kayan nokta bölme
float, doubleve decimal türleri için işleç, / iki işlenenin bölüm değerini döndürür:
Console.WriteLine(16.8f / 4.1f); // output: 4.097561
Console.WriteLine(16.8d / 4.1d); // output: 4.09756097560976
Console.WriteLine(16.8m / 4.1m); // output: 4.0975609756097560975609756098
bir işlenen isedecimal, diğer işlenen veya doubleolamaz float çünkü ne de floatdouble örtük dönüştürmesi yokturdecimal. veya float işlenenini türüne doubledecimal açıkça dönüştürmeniz gerekir. Sayısal türler arasındaki dönüştürmeler hakkında daha fazla bilgi için bkz . Yerleşik sayısal dönüştürmeler.
Kalan işleç %
Kalan işleç % , soldaki işlenenini sağ işlenenine böldikten sonra kalanı hesaplar.
Kalan tamsayı
Tamsayı türlerinin işlenenleri için sonucu a % b , $a - \frac{a}{b} \times b$ tarafından üretilen değerdir. Sıfır olmayan geri kalanın işareti, aşağıdaki örnekte gösterildiği gibi sol işlenenin işaretiyle eşleşir:
Console.WriteLine(5 % 4); // output: 1
Console.WriteLine(5 % -4); // output: 1
Console.WriteLine(-5 % 4); // output: -1
Console.WriteLine(-5 % -4); // output: -1
Math.DivRem Hem tamsayı bölme hem de kalan sonuçları hesaplamak için yöntemini kullanın.
Kayan nokta geri kalanı
float ve double işlenenleri için, sonlu x % y değerinin sonucudur xy ve z
- sıfır değilse işareti
z, işaretiyle eşleşirx. - mutlak değeri
z$|x| - n \times |y|$ hesaplamasından gelir; buradan$\frac{|x|} değerinden küçük veya buna eşit en büyük tamsayıdır{|y|}$. Burada, $|x|$ ve $|y|$ sırasıyla veydeğerlerini temsil ederx.
Not
Kalanı hesaplamanın bu yöntemi, tamsayı işlenenleri için kullanılan yönteme benzer, ancak IEEE 754 belirtiminden farklıdır. IEEE 754 belirtimine uygun kalan işleme ihtiyacınız varsa yöntemini kullanın Math.IEEERemainder .
İşlecin sonlu olmayan işlenenlerle davranışı % hakkında bilgi için C# dil belirtiminin Kalan işleç bölümüne bakın.
İşlenenler için decimal , kalan işleç % türün kalan işleciyleSystem.Decimal aynı şekilde çalışır.
Aşağıdaki örnek, kalan işlecin kayan nokta işlenenleriyle nasıl davrandığını gösterir:
Console.WriteLine(-5.2f % 2.0f); // output: -1.2
Console.WriteLine(5.9 % 3.1); // output: 2.8
Console.WriteLine(5.9m % 3.1m); // output: 2.8
Toplama işleci +
Toplama işleci + işlenenlerinin toplamını hesaplar:
Console.WriteLine(5 + 4); // output: 9
Console.WriteLine(5 + 4.3); // output: 9.3
Console.WriteLine(5.1m + 4.2m); // output: 9.3
Dize birleştirme ve temsilci birleşimi için işlecini de kullanabilirsiniz + . Daha fazla bilgi için ve + işleçleri+= bakın.
Çıkarma işleci -
Çıkarma işleci - sağ işleneni sol işlenenden çıkarır:
Console.WriteLine(47 - 3); // output: 44
Console.WriteLine(5 - 4.3); // output: 0.7
Console.WriteLine(7.5m - 2.3m); // output: 5.2
Bir temsilciyi kaldırmak için işlecini - de kullanabilirsiniz. Daha fazla bilgi için bkz - . ve -= işleçleri.
Bileşik atama
İkili işleç opiçin formun bileşik atama ifadesi
x op= y
Şu değere eşdeğerdir:
x = x op y
Sadece x bir kez değerlendirilir.
Aşağıdaki örnekte, aritmetik işleçlerle bileşik atama kullanımı gösterilmektedir:
int a = 5;
a += 9;
Console.WriteLine(a); // output: 14
a -= 4;
Console.WriteLine(a); // output: 10
a *= 2;
Console.WriteLine(a); // output: 20
a /= 4;
Console.WriteLine(a); // output: 5
a %= 3;
Console.WriteLine(a); // output: 2
Sayısal yükseltmeler nedeniyle, işlemin sonucu op türüne Txörtük olarak dönüştürülebilir olmayabilir. Böyle bir durumda, önceden tanımlanmış bir işleçse ve işlemin sonucu türüne açıkça dönüştürülebilirseop, formun T bileşik atama ifadesi ile eşdeğerdirx, ancak yalnızca x op= y bir kez değerlendirilir.x = (T)(x op y)x Aşağıdaki örnekte bu davranış gösterilmektedir:
byte a = 200;
byte b = 100;
var c = a + b;
Console.WriteLine(c.GetType()); // output: System.Int32
Console.WriteLine(c); // output: 300
a += b;
Console.WriteLine(a); // output: 44
Yukarıdaki örnekte değer, değeri 44300 türüne byte dönüştürmenin sonucudur.
Not
denetlenen taşma denetimi bağlamında, yukarıdaki örnek bir OverflowExceptionoluşturur. Daha fazla bilgi için Tamsayı aritmetik taşma bölümüne bakın.
Ayrıca ve işleçlerini sırasıyla bir olaya abone olmak ve etkinlik +=aboneliğinden çıkmak için de kullanırsınız -=. Daha fazla bilgi için bkz . Olaylara abone olma ve abonelikten çıkma.
İşleç önceliği ve ilişkilendirme
Aşağıdaki liste aritmetik işleçleri en yüksek önceliğe ve en düşük önceliğe sıralar:
- Sonek artış
x++ve azaltmax--işleçleri - Ön ek artırma
++xve azaltma--xişleçleri ile birli+ve-işleçler - Çarpımlı
*,/ve%işleçleri - Ekleme
+ve-işleçler
İkili aritmetik işleçler sol ilişkilendiricidir. Yani, derleyici soldan sağa aynı öncelik düzeyine sahip işleçleri değerlendirir.
İşleç önceliği ve ilişkilendirme tarafından uygulanan değerlendirme sırasını değiştirmek için parantezleri (), kullanın.
Console.WriteLine(2 + 2 * 2); // output: 6
Console.WriteLine((2 + 2) * 2); // output: 8
Console.WriteLine(9 / 5 / 2); // output: 0
Console.WriteLine(9 / (5 / 2)); // output: 4
Öncelik düzeyine göre sıralanmış C# işleçlerinin tam listesi için C# işleçleri makalesinin İşleç önceliği bölümüne bakın.
Aritmetik taşma ve sıfıra bölme
Bir aritmetik işlemin sonucu, ilgili sayısal türün olası sonlu değerleri aralığının dışında olduğunda, aritmetik işlecin davranışı işlenenlerinin türüne bağlıdır.
Tamsayı aritmetik taşması
Sıfıra göre tamsayı bölme her zaman bir DivideByZeroExceptionoluşturur.
Tamsayı aritmetik taşması oluşursa, denetlenebilen veya işaretsiz hale gelebilen taşma denetimi bağlamı, sonuçta elde edilen davranışı denetler:
- Denetlenen bir bağlamda, taşma sabit bir ifadede gerçekleşirse derleme zamanı hatası oluşur. Aksi takdirde, işlem çalışma zamanında gerçekleştirildiğinde bir OverflowException oluşturulur.
- İşaretlenmemiş bir bağlamda, hedef türe sığmayan yüksek sıralı bitler atılarak sonuç kesilir.
Not
Tamsayı bölme, işaretlenmemiş bir bağlamda bile oluşturulabilen özel bir büyük/küçük harfe ArithmeticException sahiptir. Sol işlenen, imzalı bir tamsayı türünün (int.MinValue veya long.MinValue) en küçük değeri ve sağ işlenen ise -1, sonuç hedef türünde temsil edilemez. Aşağıdaki örnekte gösterildiği gibi .NET çalışma zamanı bu durumda bir ArithmeticException oluşturur:
int a = int.MinValue;
int b = -1;
try
{
int c = unchecked(a / b);
}
catch (ArithmeticException)
{
Console.WriteLine($"Overflow occurred when dividing {a} by {b}.");
}
İşaretli ve işaretlenmemiş deyimleriyle birlikte, bir ifadenin checked değerlendirildiği taşma denetimi bağlamını denetlemek için ve unchecked işleçlerini kullanabilirsiniz:
int a = int.MaxValue;
int b = 3;
Console.WriteLine(unchecked(a + b)); // output: -2147483646
try
{
int d = checked(a + b);
}
catch(OverflowException)
{
Console.WriteLine($"Overflow occurred when adding {a} to {b}.");
}
Varsayılan olarak, aritmetik işlemler işaretsiz bir bağlamda gerçekleşir.
Kayan nokta aritmetik taşması
ve double türlerini kullanarak float aritmetik işlemler hiçbir zaman özel durum oluşturmaz. Bu türleri kullanan aritmetik işlemlerin sonucu, sonsuzluğu temsil eden ve sayı olmayan özel değerlerden biri olabilir:
double a = 1.0 / 0.0;
Console.WriteLine(a); // output: Infinity
Console.WriteLine(double.IsInfinity(a)); // output: True
Console.WriteLine(double.MaxValue + double.MaxValue); // output: Infinity
double b = 0.0 / 0.0;
Console.WriteLine(b); // output: NaN
Console.WriteLine(double.IsNaN(b)); // output: True
Türün işlenenleri decimal için aritmetik taşma her zaman bir OverflowExceptionoluşturur. Sıfıra bölme her zaman bir DivideByZeroExceptionoluşturur.
Yuvarlama hataları
Gerçek sayıların kayan nokta gösterimindeki genel sınırlamalar ve kayan nokta aritmetiği nedeniyle kayan nokta türleri kullanan hesaplamalarda yuvarlama hataları oluşabilir. bir ifadenin sonucu beklenen matematiksel sonuçtan farklı olabilir. Aşağıdaki örnekte bu tür birkaç durum gösterilmektedir:
Console.WriteLine(.41f % .2f); // output: 0.00999999
double a = 0.1;
double b = 3 * a;
Console.WriteLine(b == 0.3); // output: False
Console.WriteLine(b - 0.3); // output: 5.55111512312578E-17
decimal c = 1 / 3.0m;
decimal d = 3 * c;
Console.WriteLine(d == 1.0m); // output: False
Console.WriteLine(d); // output: 0.9999999999999999999999999999
Daha fazla bilgi için System.Double, System.Single veya System.Decimal başvuru sayfalarına bakın.
İşleç aşırı yüklenebilirliği
Kullanıcı tanımlı bir tür için tekli (++, --, +ve -) ve ikili (*, /, %, +ve -) aritmetik işleçlerini aşırı yükleyebilirsiniz. bir ikili işleci aşırı yüklerken, ilgili bileşik atama işlecini de örtük olarak aşırı yüklersiniz. C# 14'den başlayarak, kullanıcı tanımlı bir tür daha verimli bir uygulama sağlamak için bileşik atama işleçlerini (op=) açıkça aşırı yükleyebilir. Genellikle, bir tür bu işleçleri aşırı yükler çünkü değer, işlemin sonucunu depolamak için yeni bir örnek ayırma yerine yerinde güncelleştirilebilir. Bir tür açık bir aşırı yükleme sağlamazsa, derleyici örtük aşırı yüklemeyi oluşturur.
Kullanıcı tanımlı işaretli işleçler
Bir aritmetik işleci aşırı yüklerken, söz konusu checked işlecin denetlenen sürümünü tanımlamak için anahtar sözcüğünü kullanabilirsiniz. Aşağıdaki örnek bunun nasıl yapılacağını gösterir:
public record struct Point(int X, int Y)
{
public static Point operator checked +(Point left, Point right)
{
checked
{
return new Point(left.X + right.X, left.Y + right.Y);
}
}
public static Point operator +(Point left, Point right)
{
return new Point(left.X + right.X, left.Y + right.Y);
}
}
denetlenen işleci tanımlarken, değiştirici olmadan checked ilgili işleci de tanımlamanız gerekir.
denetlenen bir bağlam, denetlenen işleci çağırır ve işaretlenmemiş bir bağlam değiştirici olmadan checked işleci çağırır.
Bir işlecin her iki sürümünü de tanımladığınızda, davranışı yalnızca bir işlemin sonucu sonuç türünde temsil etmek için çok büyük olduğunda farklılık gösterir:
- denetlenen işleç bir OverflowExceptionoluşturur.
- Değiştiricisi
checkedolmayan bir işleç, kesilmiş bir sonucu temsil eden bir örnek döndürür.
Yerleşik aritmetik işleçlerin davranış farkı hakkında bilgi için Aritmetik taşma ve sıfıra bölme bölümüne bakın.
Değiştiriciyi checked yalnızca aşağıdaki işleçlerden herhangi birini aşırı yüklerken kullanabilirsiniz:
- Birli
++,--ve-işleçleri - İkili
*,/,+ve-işleçleri - Bileşik atama
*=,/=,+=ve-=işleçleri (C# 14 ve üzeri) - Açık dönüştürme işleçleri
Not
Değiştirici, checked gövdesindeki taşma denetimi bağlamını etkilemez. Varsayılan bağlam CheckForOverflowUnderflow derleyici seçeneğinin değeriyle tanımlanır. Bu bölümün checked başındaki örnekte gösterildiği gibi taşma denetimi bağlamını açıkça belirtmek için ve unchecked deyimlerini kullanın.
C# dili belirtimi
Daha fazla bilgi için C# dil belirtiminin aşağıdaki bölümlerine bakın:
- Sonek artış ve azaltma işleçleri
- Ön ek artırma ve azaltma işleçleri
- Birli artı işleci
- Birli eksi işleci
- Çarpma işleci
- Bölme işleci
- Kalan işleç
- Toplama işleci
- Çıkarma işleci
- Bileşik atama
- İşaretli ve işaretsiz işleçler
- Sayısal yükseltmeler
- Kullanıcı tanımlı bileşik atama