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:

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, longve ulong türleri için inttanımlanır. İşlenenler diğer tam sayı türlerinden (sbyte, byte, short, ushortveya 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ğeridirx:

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ğeridirx:

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ğeridirx:

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ğeridirx:

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 , doubleveya 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, doubleve 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 doublene float olabilir, ne de floatdouble örtük olarak dönüştürülebilirdecimal. veya double işlenenini türüne floatdecimal 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 % yz ve y

  • sıfır değilse işareti z, işaretiyle xaynıdır.
  • mutlak değeri tarafından üretilen |x| - n * |y| değerdir; burada n 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'nin yx 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ş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 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ç opiç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 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 x op= y bileşik atama ifadesi ile eşdeğerdirx = (T)(x op y), ancak yalnızca x bir kez değerlendirilir.Tx 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 düzeye kadar sıralar:

  • Sonek artış x++ ve azaltma x-- 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 checkedunchecked 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:

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:

Ayrıca bkz.