Aritmetik işleçler (C# başvurusu)
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
Bu işleçler tüm tam sayı ve kayan nokta sayısal türleri tarafından desteklenir.
Tam sayı türleri söz konusu olduğunda, bu işleçler (ve --
işleçleri hariç++
) , uint
, long
ve ulong
türleri için int
tanımlanır. İşlenenler diğer tam sayı türlerinden (sbyte
, byte
, short
, ushort
veya char
) olduğunda, değerleri aynı zamanda bir işlemin sonuç türü olan türe int
dönüştürülür. İşlenenler farklı integral veya kayan nokta türlerinde olduğunda, 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.
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 desteklenir: 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ümü kayan noktalı sayı olarak elde etmek için , double
veya decimal
türünü kullanınfloat
:
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
, double
ve decimal
türleri için, işlecin sonucu /
iki işlenenin bölümdü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
İşlenenlerden biri isedecimal
, başka bir işlenen ne veya double
ne float
olabilir, ne de float
double
örtük olarak dönüştürülebilirdecimal
. veya double
işlenenini türüne float
decimal
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
, tarafından a - (a / b) * b
üretilen değerdir. Sıfır olmayan geri kalanın işareti, aşağıdaki örnekte gösterildiği gibi soldaki işlenenin işaretiyle aynıdır:
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
değerinin sonucudur x % y
z
ve y
- sıfır değilse işareti
z
, işaretiylex
aynıdır. - mutlak değeri tarafından üretilen
|x| - n * |y|
değerdir; buradan
ve'den|x| / |y|
|x|
küçük veya buna eşit olabilecek en büyük tamsayıdır ve|y|
sırasıyla ve'niny
x
mutlak değerleridir.z
Not
Geri kalanı hesaplamanın bu yöntemi, tamsayı işlenenleri için kullanılana 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 decimal
için, kalan işleç %
türün kalan işlecine System.Decimal eşdeğerdir.
Aşağıdaki örnek, kayan nokta işlenenleriyle kalan işlecin davranışı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 makalesine +
bakın.
Çıkarma işleci -
Çıkarma işleci -
sağ işlenenini sol işleneninden çı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
Temsilci kaldırma için işlecini -
de kullanabilirsiniz. Daha fazla bilgi için ve -=
işleçleri makalesine -
bakın.
Bileşik atama
İkili işleç op
için formun bileşik atama ifadesi
x op= y
eşdeğerdir
x = x op y
ancak bu x
yalnızca 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 T
x
ö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 x op= y
bileşik atama ifadesi ile eşdeğerdirx = (T)(x op y)
, ancak yalnızca x
bir kez değerlendirilir.T
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 44
300
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 düzeye kadar sıralar:
- Sonek artış
x++
ve azaltmax--
işleçleri - Ön ek artırma
++x
ve azaltma--x
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, aynı öncelik düzeyine sahip işleçler soldan sağa değerlendirilir.
İş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.
İş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ürleriyle float
aritmetik işlemler hiçbir zaman özel durum oluşturmaz. Bu türlerdeki 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österiminin genel sınırlamaları ve kayan nokta aritmetiği nedeniyle kayan nokta türlerine sahip hesaplamalarda yuvarlama hataları oluşabilir. Yani, bir ifadenin üretilen 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ında açıklamalara bakın.
İşleç aşırı yüklenebilirliği
Kullanıcı tanımlı bir tür, birli (, , ve ) ve -
ikili (*
, /
, %
, +
ve -
) aritmetik işleçlerini aşırı yükleyebilir. +
--
++
İkili işleç aşırı yüklendiğinde, buna karşılık gelen bileşik atama işleci de örtük olarak aşırı yüklenir. Kullanıcı tanımlı bir tür, bileşik atama işlecini açıkça aşırı yükleyemez.
Kullanıcı tanımlı işaretli işleçler
C# 11'de başlayarak, bir aritmetik işleci aşırı yüklerken, bu işlecin denetlenen sürümünü tanımlamak için anahtar sözcüğünü kullanabilirsinizchecked
. 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 işleç denetlenen bir bağlamda çağrılır; değiştiricisi olmayan checked
işleç işaretlenmemiş bir bağlamda çağrılır. İşleci yalnızca değiştirici olmadan checked
sağlarsanız, hem hem checked
unchecked
de bağlamında çağrılır.
Bir işlecin her iki sürümünü de tanımladığınızda, davranışlarının yalnızca bir işlemin sonucu sonuç türünde aşağıdaki gibi temsil etmek için çok büyük olduğunda farklı olması beklenir:
- denetlenen işleç bir OverflowExceptionoluşturur.
- Değiştiricisi
checked
olmayan 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 - Açık dönüştürme işleçleri
Not
denetlenen işlecin gövdesindeki taşma denetimi bağlamı, değiştiricinin checked
varlığından etkilenmez. 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