نوع دیگر از عملگرهای سی شارپ عملگرهای جایگزینی نام دارند. این عملگرها مقدار متغیر سمت راست خود را در متغیر سمت چپ قرار می دهند. جدول زیر انواع عملگرهای تخصیصی در سی شارپ را نشان میدهد:
از عملگر =+ برای اتصال دو رشته نیز میتوان استفاده کرد. استفاده از این نوع عملگرها در واقع یک نوع خلاصه نویسی در کد است. مثلا شکل اصلی کد var1 += var2 به صورت var1 = var1 + var2 میباشد. این حالت کدنویسی زمانی کارایی خود را نشان میدهد که نام متغیرها طولانی باشد. برنامه زیر چگونگی استفاده از عملگرهای تخصیصی و تأثیر آنها را بر متغیرها نشان میدهد.
در برنامه از سه عملگر تخصیصی استفاده شده است. ابتدا یک متغیر و مقدار 10 با استفاده از عملگر = به آن اختصاص داده شده است. سپس به آن با استفاده از عملگر =+ مقدار 10 اضافه شده است. و در آخر به وسیله عملگر =- عدد 10 از آن کم شده است.
عملگرهای مقایسه ای
از عملگرهای مقایسه ای برای مقایسه مقادیر استفاده میشود. نتیجه این مقادیر یک مقدار بولی (منطقی) است. این عملگرها اگر نتیجه مقایسه دو مقدار درست باشد، مقدار true و اگر نتیجه مقایسه اشتباه باشد، مقدار false را نشان می دهند. این عملگرها به طور معمول در دستورات شرطی به کار می روند. به این ترتیب که باعث ادامه یا توقف دستور شرطی میشوند. جدول زیر عملگرهای مقایسه ای در سی شارپ را نشان میدهد:
برنامه زیر نحوه عملکرد این عملگرها را نشان می دهد:
در مثال بالا ابتدا دو متغیر را که می خواهیم با هم مقایسه کنیم را ایجاد کرده و به آنها مقادیری اختصاص می دهیم. سپس با استفاده از یک عملگر مقایسه ای آنها را با هم مقایسه کرده و نتیجه را چاپ میکنیم. به این نکته توجه کنید که هنگام مقایسه دو متغیر از عملگر == به جای عملگر = باید استفاده شود. عملگر = عملگر تخصیصی است و در عبارتی مانند x = y مقدار y را در به x اختصاص میدهد. عملگر == عملگر مقایسه ای است که دو مقدار را با هم مقایسه می کند مانند x==y و اینطور خوانده میشود x برابر است با y.
عملگرهای منطقی بر روی عبارات منطقی عمل می کنند و نتیجه آنها نیز یک مقدار بولی است. از این عملگرها اغلب برای شرط های پیچیده استفاده میشود. همانطور که قبلا یاد گرفتید مقادیر بولی میتوانند false یا true باشند. فرض کنید که var2 و var3 دو مقدار بولی هستند.
عملگر منطقی (&&) AND
اگر مقادیر دو طرف این عملگر،true باشند، عملگر AND مقدار true را بر می گرداند. در غیر اینصورت اگر یکی از مقادیر یا هر دوی آنها false باشند، مقدار false را بر می گرداند. در زیر جدول درستی عملگر AND نشان داده شده است:
برای درک بهتر تأثیر عملگر AND یادآوری میکنیم که این عملگر فقط در صورتی مقدار true را نشان میدهد که هر دو عملوند مقدارشان true باشد. در غیر اینصورت نتیجه تمام ترکیب های بعدی، false خواهد شد. استفاده از عملگر AND مانند استفاده از عملگرهای مقایسه ای است. به عنوان مثال نتیجه عبارت زیر درست (true) است اگر سن (age) بزرگتر از 18 و salary کوچکتر از 1000 باشد.
result = (age > 18) && (salary < 1000);
عملگر AND زمانی کارآمد است که ما با محدوده خاصی از اعداد سرو کار داریم. مثلا عبارت 100 =< x =< ا10 بدین معنی است که x میتواند مقداری شامل اعداد 10 تا 100 را بگیرد. حال برای انتخاب اعداد خارج از این محدوده میتوان از عملگر منطقی AND به صورت زیر استفاده کرد.
inRange = (number <= 10) && (number >= )001;
عملگر منطقی (||) OR
اگر یکی یا هر دو مقدار دو طرف عملگر OR، درست (true) باشد، عملگر OR مقدار true را بر می گرداند. جدول درستی عملگر OR در زیر نشان داده شده است:
در جدول بالا مشاهده میکنید که عملگر OR در صورتی مقدار false را بر میگرداند که مقادیر دو طرف آن false باشند. کد زیر را در نظر بگیرید. نتیجه این کد در صورتی درست (true) است، که رتبه نهایی دانش آموز (finalGrade) بزرگتر از 75 یا نمره نهایی امتحان آن 100 باشد.
isPassed = (finalGrade >= 75) || (finalExam == 100);
برخلف دو اپراتور OR و AND عملگر منطقی NOT یک عملگر یگانی است و فقط به یک عملوند نیاز دارد. این عملگر یک مقدار یا عبارت بولی را نفی می کند. مثلا اگر عبارت یا مقدار true باشد آنرا false و اگر false باشد آنرا true میکند. جدول زیر عملکرد اپراتور NOT را نشان میدهد:
نتیجه کد زیر در صورتی درست است که age (سن) بزرگتر یا مساوی 18 نباشد.
isMinor = !(age >= 18);
عملگرهای بیتی به شما اجازه می دهند که شکل باینری انواع داده ها را دستکاری کنید.
برای درک بهتر این درس توصیه می شود که شما سیستم باینری و نحوه تبدیل اعداد اعشاری به باینری را از لینک زیر یاد بگیرید:
آموزش تبدیل اعداد دسیمال به باینری
در سیستم باینری (دودویی) که کامپیوتر از آن استفاده می کند وضعیت هر چیز یا خاموش است یا روشن. برای نشان دادن حالت روشن از عدد 1 و برای نشان دادن حالت خاموش از عدد 0 استفاده میشود. بنابراین اعداد باینری فقط میتوانند صفر یا یک باشند. اعداد باینری را اعداد در مبنای 2 و اعداد اعشاری را اعداد در مبنای 10 می گویند. یک بیت نشان دهنده یک رقم باینری است و هر بایت نشان دهنده 8 بیت است. به عنوان مثال برای یک داده از نوع int به 32 بیت یا 4 بایت فضا برای ذخیره آن نیاز داریم، این بدین معناست که اعداد از 32 رقم 0 و 1 برای ذخیره استفاده می کنند. برای مثال عدد 100 وقتی به عنوان یک متغیر از نوع int ذخیره میشود در کامپیوتر به صورت زیر خوانده میشود:
000000000000000000000000000001100100
عدد 100 در مبنای ده معادل عدد 1100100 در مبنای 2 است. در اینجا 7 رقم سمت راست نشان دهنده عدد 100 در مبنای 2 است و مابقی صفرهای سمت چپ برای پر کردن بیتهایی است که عدد از نوع int نیاز دارد. به این نکته توجه کنید که اعداد باینری از سمت راست به چپ خوانده میشوند. عملگرهای بیتی سی شارپ در جدول زیر نشان داده شده اند:
عملگر بیتی (&) AND
عملگر بیتی AND مانند کاری شبیه عملگر منطقی AND انجام میدهد با این تفاوت که این عملگر بر روی بیت ها کار می کند. اگر مقادیر دو طرف آن 1 باشد، مقدار 1 را بر می گرداند و اگر یکی یا هر دو طرف آن صفر باشد مقدار صفر را بر می گرداند. جدول درستی عمگر بیتی AND در زیر آمده است:
در زیر نحوه استفاده از عملگر بیتی AND آمده است:
int result = 5 & 3; Console.WriteLine(result);
1
همانطور که در مثال بالا مشاهده میکنید، نتیجه عملکرد عملگر AND بر روی دو مقدار 5 و 3 عدد 1 میشود. اجازه بدهید ببینیم که چطور این نتیجه را به دست می آید:
5: 00000000000000000000000000000101
3: 00000000000000000000000000000011
--------------------------------------------------------------------
1: 00000000000000000000000000000001
ابتدا دو عدد 5 و 3 به معادل باینری شان تبدیل میشوند. از آنجاییکه هر عدد صحیح (int(32 بیت است از صفر برای پر کردن بیت های خالی استفاده میکنیم. با استفاده از جدول درستی عملگر بیتی AND میتوان فهمید که چرا نتیجه عدد یک میشود.
اگر مقادیر دو طرف عملگر بیتی OR هر دو صفر باشند نتیجه 0 در غیر اینصورت 1 خواهد شد. جدول درستی این عملگر در زیر آمده است:
نتیجه عملگر بیتی OR در صورتی 0 است که عملوندهای دو طرف آن 0 باشند. اگر فقط یکی از دو عملوند 1 باشد، نتیجه 1 خواهد شد. به مثال زیر توجه کنید:
int result = 7 | 9; Console.WriteLine(result);
15
وقتی که از عملگر بیتی OR برای دو مقدار در مثال باال (7 و 9) استفاده میکنیم، نتیجه 15 می شود. حال بررسی میکنیم که چرا این نتیجه به دست آمده است؟
7: 00000000000000000000000000000111
9: 00000000000000000000000000001001
--------------------------------------------------------------------
15:00000000000000000000000000001111
با استفاده از جدول درستی عملگر بیتی OR میتوان نتیجه استفاده از این عملگر را تشخیص داد. عدد 1111 باینری معادل عدد 15 صحیح است.
جدول درستی این عملگر در زیر آمده است:
در صورتیکه عملوندهای دو طرف این عملگر هر دو 0 یا هر دو 1 باشند نتیجه 0، در غیر اینصورت نتیجه 1 میشود. در مثال زیر تأثیر عملگر بیتی XOR را بر روی دو مقدار مشاهده میکنید:
int result = 5 ^ 7; Console.WriteLine(result);
در زیر معادل باینری اعداد بالا (5 و 7) نشان داده شده است.
5: 00000000000000000000000000000101
7: 00000000000000000000000000000111
--------------------------------------------------------------------
2: 00000000000000000000000000000010
با نگاه کردن به جدول درستی عملگر بیتی XOR میتوان فهمید که چرا نتیجه عدد 2 میشود.
این عملگر یک عملگر یگانی است و فقط به یک عملوند نیاز دارد. در زیر جدول درستی این عملگر آمده است:
عملگر بیتی NOT مقادیر بیتها را معکوس میکند. در زیر چگونگی استفاده از این عملگر آمده است:
int result = ~7; Console.WriteLine(result);
به نمایش باینری مثال بالا که در زیر نشان داده شده است توجه نمایید.
7 : 00000000000000000000000000000111
--------------------------------------------------------------------
-8 : 11111111111111111111111111111000
فرض کنید که از یک سبک خاص فونت در برنامه تان استفاده کنید. کدهای مربوط به هر سبک هم در جدول زیر آمده است:
توجه کنید که مقدار اولیه 0 بدین معنی است که میخواهید از سبک regular (عادی) استفاده کنید.
int fontStyle = 0;
برای نشان دادن فونتها به صورت کلفت (Bold) از عملگر بیتی OR استفاده میشود. توجه کنید که برای فونت Bold باید کد 1 را به کار برید.
fontStyle = fontStyle | 1;
برای استفاده از سبک Italic باید از عملگر بیتی OR و کد 2 استفاده شود.
fontStyle |= 2;
برای استفاده از سایر سبک ها میتوان به روش های ذکر شده در بالا عمل کرد و فقط کدها را جایگزین کنید. اگر بخواهید یک سبک جدید ایجاد کنید که ترکیبی از چند سبک باشد، میتوانید به سادگی عملگر بیتی OR را در بین هر سبک فونت قرار دهید مانند مثال زیر:
fontStyle = 1 | 2 | 4 | 8;
عملگر بیتی تغییر مکان (shift)
این نوع عملگرها به شما اجازه می دهند که بیت ها را به سمت چپ یا راست جا به جا کنید. دو نوع عملگر بیتی تغییر مکان وجود دارد که هر کدام دو عملوند قبول می کنند. عملوند سمت چپ این عملگرها حالت باینری یک مقدار و عملوند سمت راست تعداد جابه جایی بیت ها را نشان میدهد.
این عملگر، بیت های عملوند سمت چپ را به تعداد n مکان مشخص شده توسط عملوند سمت راست، به سمت چپ منتقل می کند. به عنوان مثال:
int result = 10 << 2; Console.WriteLine(result);
40
در مثال بالا ما بیت های مقدار 10 را دو مکان به سمت چپ منتقل کرده ایم، حال بیایید تأثیر این انتقال را بررسی کنیم:
10: 00000000000000000000000000001010
--------------------------------------------------------------------
40: 00000000000000000000000000101000
مشاهده میکنید که همه بیت ها به اندازه دو واحد به سمت چپ منتقل شده اند. در این انتقال دو صفر از صفرهای سمت چپ کم میشود و در عوض دو صفر به سمت راست اضافه میشود.
این عملگر شبیه به عملگر تغییر مکان به سمت چپ است با این تفاوت که بیت ها را به سمت راست جا به جا می کند. به عنوان مثال:
int result = 100 >> 4; Console.WriteLine(result);
6
با استفاده از عملگرتغییر مکان به سمت راست بیتهای مقدار 100 را به اندازه 4 واحد به سمت چپ جا به جا میکنیم. اجازه بدهید تأثیر این جا به جایی را مورد بررسی قرار دهیم:
100: 00000000000000000000000001100100
--------------------------------------------------------------------
6: 00000000000000000000000000000110
هر بیت به اندازه 4 واحد به سمت راست منتقل میشود، بنابراین 4 بیت اول سمت راست حذف شده و چهار صفر به سمت چپ اضافه میشود.
تقدم عملگرها مشخص میکند که در محاسباتی که بیش از دو عملوند دارند، ابتدا کدام عملگر اثرش را اعمال کند. عملگرها در سی شارپ در محاسبات دارای حق تقدم هستند. به عنوان مثال:
number = 1 + 2 * 3 / 1;
اگر ما حق تقدم عملگرها را رعایت نکنیم و عبارت بالا را از سمت چپ به راست انجام دهیم نتیجه 9 خواهد شد (3=2+1 سپس 9=3×3 و در آخر 9=9/1). اما کامپایلر با توجه به تقدم عملگرها محاسبات را انجام میدهد. برای مثال عمل ضرب و تقسیم نسبت به جمع و تفریق تقدم دارند. بنابراین در مثال فوق ابتدا عدد 2 ضربدر 3 و سپس نتیجه آنها تقسیم بر 1 میشود که نتیجه 6 به دست می آید. در آخر عدد 6 با 1 جمع میشود و عدد 7 حاصل میشود. در جدول زیر تقدم برخی از عملگرهای سی شارپ آمده است:
ابتدا عملگرهای با بالاترین و سپس عملگرهای با پایین ترین حق تقدم در محاسبات تأثیر می گذارند. به این نکته توجه کنید که تقدم عملگرها ++ و -- به مکان قرارگیری آنها بستگی دارد (در سمت چپ یا راست عملوند باشند.) به عنوان مثال:
int number = 3; number1 = 3 + ++number; //results to 7 number2 = 3 + number++; //results to 6
در عبارت اول ابتدا به مقدار number یک واحد اضافه شده و 4 میشود و سپس مقدار جدید با عدد 3 جمع میشود و در نهایت عدد 7 به دست می آید. در عبارت دوم مقدار عددی 3 به مقدار number اضافه میشود و عدد 6 به دست می آید. سپس این مقدار در متغیر number2 قرار می گیرد. و در نهایت مقدار number به 4 افزایش می یابد. برای ایجاد خوانایی در تقدم عملگرها و انجام محاسباتی که در آنها از عملگرهای زیادی استفاده میشود از پرانتز استفاده میکنیم:
number = ( 1 + 2 ) * ( 3 / 4 ) % ( 5 - ( 6 * 7 ));
در مثال بالا ابتدا هر کدام از عباراتی که داخل پرانتز هستند مورد محاسبه قرار می گیرند. به نکته ای در مورد عبارتی که در داخل پرانتز سوم قرار دارد توجه کنید. در این عبارت ابتدا مقدار داخلی ترین پرانتز مورد محاسبه قرار می گیرد یعنی مقدار 6 ضربدر 7 شده و سپس از 5 کم میشود. اگر دو یا چند عملگر با حق تقدم یکسان موجود باشد ابتدا باید هر کدام از عملگرها را که در ابتدای عبارت می آیند مورد ارزیابی قرار دهید. به عنوان مثال:
number = 3 * 2 + 8 / 4;
هر دو عملگر * و / دارای حق تقدم یکسانی هستند. بنابراین شما باید از چپ به راست آنها را در محاسبات تأثیر دهید. یعنی ابتدا 3 را ضربدر 2 میکنید و سپس عدد 8 را بر 4 تقسیم میکنید. در نهایت نتیجه دو عبارت را جمع کرده و در متغیر number قرار می دهید.