Aritmetik işleçler (C# Başvurusu)

Aşağıdaki işleçler, sayısal türlerde işlenenler ile aritmetik işlemler gerçekleştirir:

Bu işleçler tüm integral ve kayan nokta sayısal türleri tarafından desteklenir.

İntegral türleri söz konusu olduğunda, bu işleçler ( ++ ve -- işleçleri hariç),,, int uint long ve türleri için tanımlanır ulong . İşlenenler diğer integral türlerinde ( sbyte , byte , short , ushort , veya char ) olduğunda, değerleri int bir işlemin sonuç türü olan türüne dönüştürülür. İşlenenler farklı integral veya kayan nokta türleri olduğunda, bu tür varsa, değerleri en yakın 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 integral ve kayan nokta sayısal türleri ve char türü için tanımlanır.

Artış işleci + +

Birli artış işleci, ++ işleneni 1 artırır. İşlenen bir değişken, özellik erişimi veya Dizin Oluşturucu erişimi olmalıdır.

Artırma işleci iki biçimde desteklenir: Sonek artışı işleci, x++ ve önek artışı işleci, ++x .

Sonek artırma işleci

Sonucu, x++ x Aşağıdaki örnekte gösterildiği gibi, işlemden önceki değeridir:

int i = 3;
Console.WriteLine(i);   // output: 3
Console.WriteLine(i++); // output: 3
Console.WriteLine(i);   // output: 4

Ön ek artırma işleci

Sonucu, ++x x Aşağıdaki örnekte gösterildiği gibi, işlemden sonraki değerdir:

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şleneninin 1 değerini azaltır. İşlenen bir değişken, özellik erişimi veya Dizin Oluşturucu erişimi olmalıdır.

Azaltma işleci iki formda desteklenir: sonek azaltma işleci, x-- ve önek azaltma işleci, --x .

Sonek azaltma işleci

Sonucu, x-- x Aşağıdaki örnekte gösterildiği gibi, işlemden önceki değeridir:

int i = 3;
Console.WriteLine(i);   // output: 3
Console.WriteLine(i--); // output: 3
Console.WriteLine(i);   // output: 2

Önek azaltma işleci

Sonucu, --x x Aşağıdaki örnekte gösterildiği gibi, işlemden sonraki değerdir:

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 olumsuzunu 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 desteklemiyor.

Ç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 yöneltme işleçtir.

Bölme işleci/

Bölme işleci, / sol işlenenini sağ işleneniyle böler.

Tamsayı bölme

Tamsayı türlerinin işlenenleri için, / işlecin sonucu bir tamsayı türüdür ve iki işlenenlerin sıfıra yuvarlayarak sonuna 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 bir kayan noktalı sayı olarak bölümünü almak için, float double veya decimal türünü kullanı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, double , Ve türleri için decimal / işlecinin sonucu iki işlenenin bir bölümü olur:

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 ise başka bir işlenen ne de, ne de decimal float örtük olarak double float double dönüştürülememiş olabilir decimal . Ya da işleneni açıkça türüne dönüştürmeniz gerekir float double decimal . Sayısal türler arasındaki dönüşümler hakkında daha fazla bilgi için bkz. yerleşik sayısal dönüşümler.

Kalan işleç yüzdesi

Kalan işleç, % sol işlenenin sağ işleneniyle bölündükten sonra kalanı hesaplar.

Tamsayı geri kalanı

Tamsayı türlerinin işlenenleri için, sonucu a % b tarafından üretilen değerdir a - (a / b) * b . Sıfır olmayan geri kalanın işareti, aşağıdaki örnekte gösterildiği gibi, sol taraftaki işleneniyle 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.DivRemHem tamsayı bölme hem de kalan sonuçları hesaplamak için yöntemini kullanın.

Kayan nokta kalanı

floatVe işlenenleri için double , x % y sonsuz x y değeri z için sonuç olarak

  • zSıfır olmayan, işareti, işaretiyle aynıdır x .
  • Öğesinin mutlak değeri, z tarafından üretilen |x| - n * |y| n en büyük olası tamsayı, ve |x| / |y| |x| |y| ' nin mutlak değerleri x sırasıyla ve y ' den daha az olan sayıdır.

Not

Bu geri kalanı hesaplama yöntemi, tamsayı işlenenleri için kullanılan, ancak IEEE 754 belirtiminden farklı olacak şekilde benzerdir. IEEE 754 belirtimine uyan geri kalan işleme ihtiyacınız varsa, Math.IEEERemainder yöntemini kullanın.

İşlecinin sınırlı olmayan işlenenlerle davranışı hakkında daha fazla 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 geri kalan işlecine eşdeğerdir System.Decimal .

Aşağıdaki örnek, kayan nokta işlenenleri geri kalan işlecinin 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

Ayrıca, + 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 tarafından çıkartı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

Bir ikili işleci için op , formun bileşik atama ifadesi

x op= y

eşdeğerdir

x = x op y

hariç x yalnızca bir kez değerlendirilir.

Aşağıdaki örnek, aritmetik bir atama kullanımını Aritmetik işleçlerle gösterir:

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ükseltmelernedeniyle, op işlemin sonucu örtük olarak türüne dönüştürülebilir olmayabilir T x . Böyle bir durumda, op önceden tanımlanmış bir işleçse ve işlemin sonucu türüne açıkça dönüştürülebilir ise, T x formun bileşik atama ifadesi x op= y öğesine eşdeğerdir x = (T)(x op y) , ancak x yalnızca bir kez değerlendirilir. 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

Ayrıca, += -= sırasıyla bir olaya abone olmak ve bu olaydanabonelik kaldırmak için ve işleçlerini kullanın. Daha fazla bilgi için bkz. olaylara abone olma ve olayları kaldırma.

İşleç önceliği ve ilişkilendirilebilirlik

Aşağıdaki liste, en yüksek öncelikten en düşüğe başlayarak aritmetik işleçleri sıralar:

  • Sonek artırma x++ ve azaltma x-- işleçleri
  • Ön ek artırma ++x ve azaltma --x ve birli + ve - işleçler
  • Çoğultıcı * , / , ve % işleçler
  • Eklenebilir + ve - işleçler

İkili aritmetik işleçler sola ilişkilendirilebilir. Diğer bir deyişle, aynı öncelik düzeyine sahip işleçler soldan sağa değerlendirilir.

()İşleç önceliği ve ilişkilendirilebilirliği tarafından uygulanan değerlendirmenin 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ıralanan C# işleçlerinin tüm listesi için c# işleçleri makalesinin operatör ö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ğerler aralığının dışında olduğunda, bir aritmetik işlecin davranışı işlenenlerinin türüne bağlıdır.

Tamsayı aritmetik taşması

Sıfıra göre tam sayı bölümü her zaman bir oluşturur DivideByZeroException .

Tamsayı aritmetik taşması olması durumunda, denetlenen veya işaretlenmemişbir taşma Denetim bağlamı ortaya çıkan davranışı denetler:

  • Denetlenen bir bağlamda, sabit bir ifadede taşma gerçekleşirse, derleme zamanı hatası oluşur. Aksi takdirde, işlem çalışma zamanında gerçekleştirildiğinde bir oluşturulur OverflowException .
  • İşaretlenmemiş bir bağlamda, sonuç, hedef türüne sığmayan yüksek sıralı bitleri atarak kesilir.

Checked ve unchecked deyimlerinin yanı sıra, checked unchecked bir ifadenin değerlendirildiği taşma denetimi bağlamını denetlemek için ve 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şaretlenmemiş bir bağlamda oluşur.

Kayan nokta aritmetik taşması

Ve türleri ile aritmetik float İşlemler double hiçbir şekilde özel durum oluşturmaz. Bu türlerle aritmetik işlemlerin sonucu, sonsuz ve sayı değil, sonsuz değerleri temsil eden ö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 için aritmetik taşma her zaman bir ve sıfıra bölme decimal OverflowException her zaman bir DivideByZeroException atar.

Yuvarlama hataları

Gerçek sayıların ve kayan nokta aritmetik kayan nokta gösteriminin genel sınırlamaları nedeniyle, kayan nokta türlerine sahip hesaplamalarda yuvarlama hataları oluşabilir. Başka bir ifadenin üretilen sonucu, beklenen matematiksel sonuçtan farklı olabilir. Aşağıdaki örnekte bu tür bazı durumlar göstermektedir:

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.Singleveya System.Decimalbaşvuru sayfalarındaki açıklamalara bakın.

İşleç aşırı yüklemesi

Kullanıcı tanımlı bir tür, birli ( , , ve ) ve ++ ikili ( , , , ve -- ) + - * / % + - aritmetik işleçlerini aşırı yükleyeblir. bir ikili işleç aşırı yük olduğunda, karşılık gelen bileşik atama işleci de örtülü olarak aşırı yüklenmiş olur. Kullanıcı tanımlı tür, bileşik atama işlecinin açıkça aşırı yüklenmesine neden olamaz.

C# dili belirtimi

Daha fazla bilgi için C# dil belirtimlerinin aşağıdaki bölümlerine bakın:

Ayrıca bkz.