Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Operator berikut melakukan operasi aritmetika dengan operand jenis numerik:
- Operator tunggal
++(kenaikan),--(penurunan),+(plus), dan-(minus) - Operator Biner
*(perkalian),/(pembagian),%(sisa),+(tambahan), dan-(pengurangan)
Semua jenis numerik integral dan floating-point mendukung operator ini.
Jenis int, , uintlong, dan ulong menentukan semua operator ini. Jenis integral lainnya (sbyte, byte, short, ushort, dan char) hanya menentukan operator ++ dan --. Untuk operator lain, jika Anda menggunakan jenis sbyteintegral , , byte, ushortshort, atau char sebagai operand, nilai dikonversi ke int jenis dan jenis hasilnya adalah int. Jika operand adalah jenis integral atau floating-point yang berbeda, nilainya dikonversi ke jenis yang paling berisi, jika jenis tersebut ada. Untuk informasi selengkapnya, lihat bagian Promosi numerik dari spesifikasi bahasa C#. Operator ++ dan -- didefinisikan untuk semua jenis numerik integral dan titik mengambang dan jenis char. Jenis hasil ekspresi penetapan majemuk adalah jenis operand sebelah kiri.
Referensi bahasa C# mendokumentasikan versi bahasa C# yang paling baru dirilis. Ini juga berisi dokumentasi awal untuk fitur dalam pratinjau publik untuk rilis bahasa yang akan datang.
Dokumentasi mengidentifikasi fitur apa pun yang pertama kali diperkenalkan dalam tiga versi terakhir bahasa atau dalam pratinjau publik saat ini.
Petunjuk / Saran
Untuk menemukan kapan fitur pertama kali diperkenalkan di C#, lihat artikel tentang riwayat versi bahasa C#.
Operator kenaikan ++
Operator kenaikan tunggal ++ menaikkan operand-nya sebesar 1. Operand harus berupa variabel, akses properti, atau akses pengindeks.
Operator kenaikan didukung dalam dua bentuk: operator kenaikan postfiks, x++, dan operator kenaikan prefiks, ++x.
Operator kenaikan postfiks
Hasilnya x++ adalah nilai xsebelum operasi, seperti yang ditunjukkan contoh berikut:
int i = 3;
Console.WriteLine(i); // output: 3
Console.WriteLine(i++); // output: 3
Console.WriteLine(i); // output: 4
Operator kenaikan prefiks
Hasilnya ++x adalah nilai xsetelah operasi, seperti yang ditunjukkan contoh berikut:
double a = 1.5;
Console.WriteLine(a); // output: 1.5
Console.WriteLine(++a); // output: 2.5
Console.WriteLine(a); // output: 2.5
Operator pengurangan --
Operator pengurangan tunggal -- mengurangi operand-nya sebesar 1. Operand harus berupa variabel, akses properti, atau akses pengindeks.
Operator penurunan tersedia dalam dua bentuk: operator penurunan pascafiks, x--, dan operator penurunan awalan, --x.
Operator penurunan postfiks
Hasilnya x-- adalah nilai xsebelum operasi, seperti yang ditunjukkan contoh berikut:
int i = 3;
Console.WriteLine(i); // output: 3
Console.WriteLine(i--); // output: 3
Console.WriteLine(i); // output: 2
Operator penurunan prefiks
Hasilnya --x adalah nilai xsetelah operasi, seperti yang ditunjukkan contoh berikut:
double a = 1.5;
Console.WriteLine(a); // output: 1.5
Console.WriteLine(--a); // output: 0.5
Console.WriteLine(a); // output: 0.5
Operator plus dan minus tunggal
Operator + tunggal mengembalikan nilai operand-nya. Operator - tunggal menghitung negasi numerik operand-nya.
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
Jenis ulong tidak mendukung operator - tunggal.
operasi perkalian *
Operator perkalian * menghitung produk operandnya:
Console.WriteLine(5 * 2); // output: 10
Console.WriteLine(0.5 * 2.5); // output: 1.25
Console.WriteLine(0.1m * 23.4m); // output: 2.34
Operator * tunggal adalah operator tidak langsung pointer.
operator pembagian /
Operator divisi / membagi operand sebelah kirinya dengan operand kanannya.
Pembagian bilangan bulat
Untuk operan jenis bilangan bulat, hasil / operator adalah jenis bilangan bulat dan sama dengan kuota dua operand yang dibulatkan ke arah nol:
Console.WriteLine(13 / 5); // output: 2
Console.WriteLine(-13 / 5); // output: -2
Console.WriteLine(13 / -5); // output: -2
Console.WriteLine(-13 / -5); // output: 2
Untuk mendapatkan kuota dari dua operan sebagai angka floating-point, gunakan float, , doubleatau decimal ketik:
Console.WriteLine(13 / 5.0); // output: 2.6
int a = 13;
int b = 5;
Console.WriteLine((double)a / b); // output: 2.6
Pembagian titik mengambang
floatUntuk jenis , double, dan decimal , / operator mengembalikan kuota dari dua operand:
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
Jika satu operand adalah decimal, operand lainnya tidak dapat atau floatdouble, karena tidak float juga double memiliki konversi implisit ke decimal. Anda harus secara eksplisit mengonversi operand float atau double ke jenis decimal. Untuk informasi selengkapnya tentang konversi antar jenis numerik, lihat Konversi numerik bawaan.
Operator sisa %
Operator % yang tersisa menghitung sisanya setelah membandingkan operand kirinya dengan operand kanannya.
Sisa bilangan bulat
Untuk operan tipe bilangan bulat, hasilnya a % b adalah nilai yang dihasilkan oleh $a - \frac{a}{b} \times b$. Tanda sisa bukan nol cocok dengan tanda operand sebelah kiri, seperti yang ditunjukkan contoh berikut:
Console.WriteLine(5 % 4); // output: 1
Console.WriteLine(5 % -4); // output: 1
Console.WriteLine(-5 % 4); // output: -1
Console.WriteLine(-5 % -4); // output: -1
Gunakan metode Math.DivRem untuk menghitung pembagian bilangan bulat dan hasil yang tersisa.
Sisa titik mengambang
Untuk operand float dan double, hasil dari x % y untuk x dan y terbatas merupakan nilai z
- Tanda
z, jika bukan nol, cocok dengan tandax. - Nilai absolut berasal dari perhitungan $|x| - n \kali |y|$, dengan
nbilanganzbulat terbesar kurang dari atau sama dengan $\frac{|x|}{|y|}$. Di sini, $|x|$ dan $|y|$ mewakili nilaixabsolut dany, masing-masing.
Catatan
Metode komputasi sisanya ini mirip dengan metode yang digunakan untuk operan bilangan bulat, tetapi berbeda dari spesifikasi IEEE 754. Jika Anda memerlukan operasi sisa yang sesuai dengan spesifikasi IEEE 754, gunakan metode Math.IEEERemainder.
Untuk informasi tentang perilaku operator % dengan operand yang bukan terbatas, lihat bagian Operator sisa dari spesifikasi bahasa C#.
Untuk decimal operand, operator % yang tersisa berfungsi sama dengan operator sisa jenis System.Decimal .
Contoh berikut menunjukkan bagaimana operator sisa berperilaku dengan operand floating-point:
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
operator tambahan +
Operator tambahan + menghitung jumlah operandnya:
Console.WriteLine(5 + 4); // output: 9
Console.WriteLine(5 + 4.3); // output: 9.3
Console.WriteLine(5.1m + 4.2m); // output: 9.3
Anda juga dapat menggunakan operator + untuk kombinasi perangkaian string dan delegasi. Untuk informasi selengkapnya, lihat artikel + dan += operator.
operasi pengurangan -
Operator pengurangan - mengurangi operand tangan kanan dari operand sebelah kiri:
Console.WriteLine(47 - 3); // output: 44
Console.WriteLine(5 - 4.3); // output: 0.7
Console.WriteLine(7.5m - 2.3m); // output: 5.2
Anda juga dapat menggunakan - operator untuk menghapus delegasi. Untuk informasi selengkapnya, lihat - operator dan -=.
Penetapan campuran
Untuk op operator biner, ekspresi penetapan campuran dari formulir
x op= y
Setara dengan
x = x op y
Kecuali bahwa x hanya dievaluasi sekali.
Contoh berikut menunjukkan penggunaan penetapan campuran dengan operator aritmetika:
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
Karena promosi numerik, hasil op operasi mungkin tidak dapat dikonversi secara implisit ke jenis Tx. Dalam kasus seperti itu, jika op adalah operator yang telah ditentukan sebelumnya dan hasil operasi secara eksplisit dapat dikonversi ke jenis T dari x, ekspresi penetapan campuran formulir x op= y setara dengan x = (T)(x op y), kecuali x hanya dievaluasi sekali. Contoh berikut menunjukkan perilaku tersebut:
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
Dalam contoh sebelumnya, nilai 44 adalah hasil dari mengonversi nilai 300 ke byte jenis .
Catatan
Dalam konteks pemeriksaan luapan yang diperiksa, contoh sebelumnya melempar OverflowException. Untuk informasi selengkapnya, lihat bagian Luapan aritmatika bilangan bulat.
Anda juga menggunakan operator += dan -= untuk berlangganan dan berhenti berlangganan dari suatu acara. Untuk informasi selengkapnya, lihat Cara berlangganan dan berhenti berlangganan dari peristiwa.
Asosiasivitas dan prioritas operator
Daftar berikut mengurutkan operator aritmatika dari prioritas tertinggi hingga prioritas terendah:
- Operator kenaikan
x++dan penurunan postfiksx-- - Prefiks kenaikan
++xdan pengurangan--xoperator, dan operator unary+dan- - Operator multiplikatif
*,/, dan% - Operator tambahan
+dan-
Operator aritmetika biner bersifat asosiatif kiri. Artinya, pengkompilasi mengevaluasi operator dengan tingkat prioritas yang sama dari kiri ke kanan.
Gunakan tanda kurung, (), untuk mengubah urutan evaluasi yang diberlakukan oleh prioritas dan asosiasi operator.
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
Untuk daftar lengkap operator C# yang diurutkan berdasarkan tingkat prioritas, lihat bagian Prioritas operator dari artikel operator C#.
Luapan aritmetika dan pembagian dengan nol
Ketika hasil operasi aritmetika berada di luar rentang kemungkinan nilai terbatas dari jenis numerik yang terlibat, perilaku operator aritmetika tergantung pada jenis operand-nya.
Luapan aritmetika bilangan bulat
Pembagian bilangan bulat dengan nol selalu melempar DivideByZeroException.
Jika terjadi luapan aritmatika bilangan bulat, konteks pemeriksaan luapan, yang dapat diperiksa atau tidak dicentang, mengontrol perilaku yang dihasilkan:
- Dalam konteks yang diperiksa, jika luapan terjadi dalam ekspresi konstanta, kesalahan waktu kompilasi terjadi. Jika tidak, ketika operasi dilakukan pada durasi, OverflowException akan dilemparkan.
- Dalam konteks yang tidak diperiksa, hasilnya dipotong dengan membuang bit berurutan tinggi yang tidak cocok dengan jenis tujuan.
Catatan
Pembagian bilangan bulat memiliki kasus khusus di mana dapat ArithmeticException dilemparkan bahkan dalam konteks yang tidak dicentang. Ketika operand kiri adalah nilai minimum dari jenis bilangan bulat yang ditandatangani (int.MinValue atau long.MinValue) dan operand kanan adalah -1, hasilnya tidak dapat diwakili dalam jenis tujuan. Runtime .NET melemparkan ArithmeticException dalam hal ini, seperti yang ditunjukkan dalam contoh berikut:
int a = int.MinValue;
int b = -1;
try
{
int c = unchecked(a / b);
}
catch (ArithmeticException)
{
Console.WriteLine($"Overflow occurred when dividing {a} by {b}.");
}
Bersama dengan pernyataan yang dicentang dan tidak dicentang , Anda dapat menggunakan checked operator dan unchecked untuk mengontrol konteks pemeriksaan luapan, di mana ekspresi dievaluasi:
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}.");
}
Secara default, operasi aritmetika terjadi dalam konteks yang tidak diperiksa.
Aritmetika Titik Mengambang
Operasi aritmatika dengan menggunakan float jenis dan double tidak pernah melemparkan pengecualian. Hasil operasi aritmatika menggunakan jenis tersebut dapat menjadi salah satu nilai khusus yang mewakili tak terbatas dan bukan angka:
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
Untuk operand jenis decimal, luapan aritmetika selalu melempar OverflowException. Pembagian dengan nol selalu melempar DivideByZeroException.
Kesalahan round-off
Karena keterbatasan umum dalam representasi floating-point dari bilangan riil dan aritmatika floating-point, kesalahan round-off dapat terjadi dalam perhitungan yang menggunakan jenis floating-point. Hasil ekspresi mungkin berbeda dari hasil matematika yang diharapkan. Contoh berikut menunjukkan beberapa kasus seperti itu:
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
Untuk informasi selengkapnya, lihat keterangan di halaman referensi System.Double, System.Single, atau System.Decimal .
Kelebihan beban operator
Anda dapat membebani operator aritmetika unary (++, --, +, dan -) dan biner (*, /, %, +, dan -) untuk jenis yang ditentukan pengguna. Ketika Anda membebani operator biner secara implisit, Anda juga secara implisit membebani operator penetapan majemuk yang sesuai. Dimulai dengan C# 14, jenis yang ditentukan pengguna dapat secara eksplisit membebani operator penetapan majemuk (op=) untuk memberikan implementasi yang lebih efisien. Biasanya, tipe meng-overload operator ini karena nilainya bisa diperbarui di tempat, daripada mengalokasikan instans baru untuk menyimpan hasil operasi. Jika jenis tidak memberikan kelebihan beban eksplisit, pengkompilasi menghasilkan kelebihan beban implisit.
Operator yang diperiksa yang ditentukan pengguna
Saat Anda membebani operator aritmatika secara berlebih, Anda dapat menggunakan checked kata kunci untuk menentukan versi operator yang dicentang . Contoh berikut ini menunjukkan cara melakukannya:
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);
}
}
Saat menentukan operator yang dicentang, Anda juga harus menentukan operator yang sesuai tanpa pengubah checked .
Konteks yang dicentang memanggil operator yang dicentang, dan konteks yang tidak dicentang memanggil operator tanpa checked pengubah.
Saat Anda menentukan kedua versi operator, perilakunya hanya berbeda ketika hasil operasi terlalu besar untuk diwakili dalam jenis hasil sebagai berikut:
- Operator yang diperiksa melempar OverflowException.
- Operator tanpa pengubah
checkedmengembalikan instans yang mewakili hasil terpotong.
Untuk informasi tentang perbedaan perilaku operator aritmatika bawaan, lihat bagian Luapan aritmatika dan pembagian berdasarkan nol .
Anda dapat menggunakan pengubah checked hanya ketika Anda membebani salah satu operator berikut:
- Operator unary
++,--, dan- - Operator biner
*,/,+, dan- - Penugasan gabungan
*=,/=,+=, dan-=operator (C# 14 dan yang lebih baru) - Operator konversi eksplisit
Catatan
Pengubah checked tidak memengaruhi konteks pemeriksaan luapan dalam isinya. Konteks default ditentukan oleh nilai opsi pengkompilasi CheckForOverflowUnderflow.
checked dan unchecked untuk secara eksplisit menentukan konteks pemeriksaan luapan, seperti contoh di awal bagian ini yang ditunjukkan.
Spesifikasi bahasa C#
Untuk informasi selengkapnya, lihat bagian berikut dari spesifikasi bahasa C#:
- Operator kenaikan dan penurunan postfiks
- Operator kenaikan dan penurunan prefiks
- Operator tunggal plus
- Operasi minus tunggal
- Operator perkalian
- Operator pembagian
- Operator sisa
- Operator tambahan
- Operasi pengurangan
- Penetapan campuran
- Operator yang diperiksa dan tidak
- Promosi numerik
- Penugasan gabungan yang ditentukan pengguna