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
, long
ve 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 operatörler için, operandlar tam sayı türlerinden sbyte
, byte
, short
, ushort
veya char
olduğunda, değerleri int
türüne dönüştürülür ve sonuç türü int
olur. İş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 , float
veya double
türünü kullanındecimal
:
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 decimal
ise, diğer bir işlenen float
veya double
olamaz, çünkü float
ve double
'ün hiçbiri decimal
'e örtük olarak dönüştürülemez. veya float
işlenenini türüne double
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 % y
değerinin sonucudur x
y
ve z
- sıfır değilse işareti
z
, işaretiylex
aynıdır. - mutlak değeri tarafından üretilen
z
değerdir; burada|x| - n * |y|
ve'denn
|x| / |y|
küçük veya buna eşit olabilecek en büyük tamsayıdır ve|x|
sırasıyla ve'nin|y|
x
mutlak değerleridir.y
Not
Geri 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 decimal
için, kalan işleç %
türün kalan işlecineSystem.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+=
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-=
bakın.
Bileşik atama
İkili işleç op
iç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 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 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 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 float
türleriyle double
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. 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
C# 11'de başlayarak, bir aritmetik işleci aşırı yüklerken, bu işlecin denetlenenchecked
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 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 - Bileşik atama
*=
,/=
,+=
ve-=
işleçleri (C# 14 ve üzeri) - Açık dönüştürme işleçleri
Not
Denetlenen bir işlecin gövdesindeki taşma kontrolü bağlamı, checked
değiştiricisinin 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
- Kullanıcı tanımlı bileşik atama