مقدمه

یک عملگر (operator) نمادی است که عمل مشخصی را روی مقادیر انجام می‌دهد. مقادیری که عملگر روی آنها اِعمال می‌شود، عملوند (operand) نامیده می‌شوند و می‌توانند به صورت مقادیر لیترال و یا در قالب متغیرها در عبارات ظاهر شوند. عملگرهای حسابی، مقایسه‌ای و منطقی مهمترین و پرکاربردترین عملگرهای C# هستند. در این درس، این عملگرها را معرفی و بررسی می‌کنیم.

عملگرهای حسابی در C#

عملگرهای حسابی (arithmetic operators) برای انجام اعمال محاسباتی روی اعداد به کار می‌روند. در جدول زیر لیست این عملگرها را می‌بینید.

نام عملگر نماد عملگر مثال
عملگر جمع (addition) + int x = 5 + 7; // x = 12
double y = 5.25 + 8.0; // y = 13.25
عملگر تفریق (subtraction) - int x = 10 - 2; // x = 8
double y = 8.0 - 5.3; // y = 2.7
عملگر ضرب (multiplication) * let x = 5 * 6; // x=30
double y = 5.0 * 8.2; // y = 41.0
عملگر تقسیم (division) / int x = 10 / 5; // x = 2
double y = 10.0 / 4.0; // y = 2.5
عملگر باقیمانده‌ی تقسیم (modulus) % int x = 30 % 4; // x = 2
double d = 30.0 % 4.5; // y = 3.0
عملگر افزایند‌ه (incrementor) ++ int x = 10;
x++; // x = 11
عملگر کاهند‌ه (decrementor) -- int x = 10;
x--; // x = 9

وقتی از عملگرهای بالا برای انجام اعمال محاسباتی استفاده می‌کنید، باید چند نکته را در نظر داشته باشید. با عملگر جمع یا addition شروع می‌کنیم.

نماد + وقتی حکم عملگر جمع را دارد که عملوندهایش عدد باشند. اما اگر در عبارت a + b یکی از علموندهای a و b یا هر دوی آنها string باشند، این نماد حکم عملگر الحاق (concatenation) را پیدا می‌کند که رشته‌ها را به هم می‌چسباند. به علاوه، اگر a و b هر دو عدد باشند اما نوع‌های متفاوتی داشته باشند، عددی که از نوع کوچک‌تر است، با یک تبدیل ضمنی به نوع بزرگ‌تر تبدیل می‌شود.

Copy Icon Program.cs
float f = 2 + 3.5f;   // f = 5.5f 
double d = 1.5 + f;   // d = 7.0
            
string s = 5 + "Hi";  // s = "5Hi"

در گزاره‌ی اول، مقدار 2 از int به float تبدیل شده و در گزاره‌ی دوم، f از float به double تبدیل شده است.

در مورد عملگر تفریق هم نکته‌ای وجود دارد که باید بدانید. این عملگر، پتانسیل بالایی برای تولید خطای تقریب دارد. به کد زیر نگاه کنید.

Copy Icon Program.cs
double x = 8.7 - 4.2;  // x != 4.5
double y = 8.7 - 4.3;  // y != 4.4
double z = 8.7 - 4.4;  // z != 4.3
            
Console.WriteLine($"x = {x}");
Console.WriteLine($"y = {y}");
Console.WriteLine($"z = {z}");

اگر این کد را اجرا کنید، نتیجه‌ی زیر را مشاهده خواهید کرد.

x = 4.499999999999999
y = 4.3999999999999995
z = 4.299999999999999
          

علت این امر به نحوه‌ی انجام عمل تفریق در حافظه‌ی کامپیوتر برمی‌گردد و ربطی به زبان C# یا هیچ زبان دیگری ندارد. اما به هر حال، باید بدانید که این مسئله برای عمل تفریق وجود دارد تا با نتایج غیر قابل انتظار مواجه نشوید. همانطور که قبلاً گفتیم، یک راه حل برای کنترل خطای تقریب، استفاده از نوع decimal است و در اولین درس از فصل بعد که به کار با اعداد اختصاص دارد، روش‌های دیگری را نیز معرفی خواهیم کرد.

در مورد عملگرهای ضرب و تقسیم هم این نکته را تکرار می‌کنم که اگر عملوندها از نوع‌های عددی متفاوتی باشند، عملوندی که از نوع کوچک‌تر است به طور ضمنی به نوع بزرگ‌تر تبدیل می‌شود.

در مورد دو عملگر افزاینده و کاهنده که دارای نمادهای ++ و -- هستند، نیز نکته‌ای وجود دارد که در مثال زیر دیده می‌شود.

Copy Icon Program.cs
int x = 8;
Console.WriteLine(x++); // => 8
Console.WriteLine(x);  // => 9
            
int y = 8;
Console.WriteLine(++y); // => 9
Console.WriteLine(y);  // => 9
            
int z = 3 + x++; 
Console.WriteLine(z);  // => 12

این عملگرها را می‌توان به دو شکل استفاده کرد. یکی به فرم x++ که باعث می‌شود ابتدا مقدار متغیر x در محاسبات شرکت کند و سپس، یک واحد به آن افزوده شود و دیگری به فرم ++x که باعث می‌شود ابتدا یک واحد به x اضافه شود و سپس در محاسبات شرکت کند.

عملگر تخصیص

در C# عملگر = عملگر تخصیص (assignment operator) نامیده می‌شود و برای تخصیص مقادیر به متغیرها به کار می‌رود. از ترکیب عملگر تخصیص با عملگرهای حسابی ‌می‌توان برای خلاصه‌نویسی برخی عبارات استفاده کرد. جدول زیر را ببینید.

عبارت معادل
x += y x = x + y
x -= y x = x -y
x *= y x = x * y
x /= y x = x / y
x %= y x = x % y

عملگرهای مقایسه‌ای

گروه دیگری از عملگرهای C# که برای مقایسه‌ی مقادیر عددی به کار می‌روند، عملگرهای مقایسه‌ای (comparisional) نامیده ‌می‌شوند. این عملگرها در جدول زیر آورده شده‌اند.

نام عملگر نماد عملگر مثال
عملگر برابری (equality) == bool b = 10 == 5; // b=false
bool b = "Hi" == "hi"; // b=false
عملگر نابرابری (not equality) != bool b = 10 != 5; // b = true
عملگر بزرگتری (greater than) > bool b = 10 > 5; // b=true
عملگر کوچکتری (less than) < bool b = 10 < 5; // b=false
عملگر بزرگتر یا مساوی (greater than or equal to) >= bool b = 10 >= 5; // b=true
عملگر کوچکتر یا مساوی (less than or equal to) <= bool b = 10 <= 10; // b=true

اولین مطلبی که باید در مورد عملگرهای مقایسه‌ای بدانید این است که نتیجه‌ی حاصل از یک عمل مقایسه‌ای همیشه یک bool است. به علاوه، علموندهای این عملگرها باید از نوع‌های عددی باشند. اگر نوع عددی عملوندها یکی نباشد، یک تبدیل ضمنی باعث می‌شود نوع کوچک‌تر به بزرگ‌تر تبدیل شود.

عملگرهای برابری ( == ) و نابرابری ( != ) می‌توانند عملوندهای bool یا string هم داشته باشند؛ البته به شرطی که هر دو عملوند از یک نوع باشند.

عملگرهای منطقی

عملگرهای منطقی (logical) گروه دیگری از عملگرهای C# هستند که روی عملوندهای bool عمل کرده و یک مقدار bool را به عنوان نتیجه بر ‌می‌گردانند. در واقع، این عملگرها همان and و or و not منطقی هستند.

نام عملگد نماد عملگر مثال
عملگر عطفی (conjunction) && bool b = (10>5) && (6>4); // b=true
bool b = (10>5) && (6>8); // b=false
عملگر فصلی (disjunction) || bool b = (10>5) || (6>4); // b=true
bool b = (10>5) || (6>8); // b=true
عملگر نفی یا نقیض (negation) ! bool b = !(10>5); // b=false