عملگرها (operator) سمبل هائي هستند که به کامپيوتر فرمان مي دهند عملي روي يک يا چند عملوند انجام دهد. عملگرها به يک ،دو يا سه عملوند (operand) نياز دارند تا روي آن عمل کنند.
عملگرهاي ++C در چند گروه قرار مي گيرند:
• عملگر انتساب
• عملگرهاي رياضي
• عملگرهاي رابطه اي
• عملگرهاي منطقي
وقتي عبارتي حاوي بيش از يک عملگر باشد به قواعدي نياز است که ترتيب انجام عملگرها را تعيين کند. اين قواعد الويت عملگر(operator precedence) ناميده مي شود. هر عملگر الويت خاصي دارد. عملگرهائي که الويت بيشتر دارند اول اجرا مي شوند.
با پرانتزها مي توان الويت عملگرها را درون عبارت تغيير داد. ارزيابي از داخلي ترين پرانتز شروع مي شود. از پرانتز براي روشن تر شدن ترتيب ارزيابي عملگرها استفاده کنيد.
اگر عبارت شامل چند عملگر با الويت يکسان باشد عملگرها از چپ به راست ارزيابي مي شوند.
بهتر است براي جلوگيري از ابهام يک عبارت پيچيده به چند عبارت ساده تر شکسته شود.
عملگر انتساب
عملگر انتساب (assignment operator) علامت مساوي (=) است. به معني اين است که عبارت سمت راست مساوي (يا rvalue) را به متغير سمت چپ مساوي (يا lvalue) تخصيص بدهد. فرم کلي آن به شکل زير است:
variable = expression;
عملگرهاي رياضي
عملگرهاي رياضي (mathematical operators) عمليات محاسباتي مانند جمع و تفريق را انجام مي دهند.
++C دو عملگر يکتائي و پنج عملگر دوتائي دارد. عملگرهاي يکتائي تنها يک آرگومان دارد مانند ++ و - - يعني تنها روي يک متغير عمل مي کنند. عملگرهاي دوتائي روي دو مقدار کار مي کنند مثل + و - .
عملگرهاي رياضي يکتائي ++C
عملگر سمبل عمل مثال
Increment ++ عملوند را يک واحد افزايش مي دهد ++x, x++
Decrement -- عملوند را يک واحد کاهش مي دهد --x, x--
عملگرهاي رياضي دوتائي ++C
عملگر سمبل عمل مثال
Addition + جمع دو عملوند x + y
Subtraction - تفريق عملوند اول از عملوند دوم x - y
Multiplication * ضرب دو عملوند x * y
Division / تقسيم عملوند اول بر علموند دوم x / y
Modulus % باقيمانده صحيح عملوند اول بر عملوند دوم x % y
عملگرهاي افزايش و کاهش تنها با متغيرها مي توانند استفاده شوند و با ثابت مجاز نيستند. اين عملگرها يک واحد از عملوند کم يا يک واحد به آن اضافه مي کنند. يعني عبارت ;++x معادل ;x=x+1 و عبارت ;--y معادل ;y=y-1 است.
توجه کنيد که عملگرهاي افزايش و کاهش مي توانند قبل يا بعد از علموند خود قرار گيرند. الويت ++ و - - بستگي به محل متغير دارد. وقتي عملگر بعنوان پيشوند استفاده مي شوند عملوند خود را قبل از استفاده تغيير مي دهند و وقتي به عنوان پسوند استفاده مي شوند عملوند خود را بعد از استفاده از آن تغيير مي دهند.
مثال. به دو مثال زير توجه کنيد.
x = 10;
y = x++; // x equals 11 and y equals 10
x = 10;
y = ++x; // x and y equal 11
عملگر منهاي يکتائي (-) عملوند خود را منفي مي کند. عملگر جمع يکتائي (+) تاثيري روي عملوند خود ندارد. کامپايلر از نحوه بکار بردن اين عملگرها د ر عبارت متوجه منظور شما مي شود.
مثال.
x = -a;
x = a * -b;
x = a * (-b); //This way is better
الويت عملگرهاي رياضي
الويت عملگرها
1 ++ --
2 * / %
3 + -
مثال. حاصل عبارت 12 % 5 * 2 برابر با 4 است.
مثال. حاصل عبارت زير 3- است.
x = 25 - (2 * (10 + (8 / 2)));
عملگرهاي رابطه اي
عملگرهاي رابطه اي (relational operators) در عبارات مقايسه اي استفاده مي شوند و يک مقدار بولين توليد مي کنند. عبارتي که داراي يک عملگر رابطه اي است به صورت true و false ارزيابي مي شوند. اگر رابطه درست باشد مقدار true يا 1 و اگر غلط باشد مقدار false يا 0 توليد مي شود.
بيشترين کاربرد عبارات رابطه اي در جملات شرطي است.
عملگرهاي رابطه اي ++C
عملگر سمبل عمل مثال
Equal == آيا عملوند اول مساوي عملوند دوم است x == y
Greater than < آيا عملوند اول بزرگتر از عملوند دوم است x > y
Less than > آيا عملوند اول کوچکتر از عملوند دوم است x < y
Less than or equal to => آيا عملوند اول کوچکتريا مساوي عملوند دوم است x <= y
Greater than or equal to =< آيا عملوند اول بزرگتريا مساوي عملوند دوم است x >= y
Not equal =! آيا عملوند اول نامساوي عملوند دوم است x != y
مثال. عبارات زير رابطه اي هستند.
5 == 1 //0 (false)
5 > 1 //1 (true)
5 != 1 //1 (true)
(5 + 10) == (3 * 5) //1 (true)
نکته. عملگر رابطه اي == را با عملگر = اشتباه نگيريد. يکي از متداولترين اشتباهات برنامه نويسان استفاده از علامت انتساب به جاي عملگر مساوي در عبارات شرطي است.
نکته. عباراتي که برابر مقداري غير صفر مي شوند به عنوان (1) true درنظر گرفته مي شوند.
مثال. با اجراي جمله زير هميشه پيغام نمايش داده مي شود زيرا مقدارx برابر با 5 مي شود و شرط هميشه درست مي شود.
if (x = 5)
cout<<"x is equal to 5";
الويت عملگرهاي رابطه اي
الويت عملگرها
1 =< => < >
2 =! ==
عملگرهاي رابطه اي الويت کمتري نسبت به عملگرهاي رياضي دارند.
مثال. دو شرط زير يکسان است.
if (x + 2 > y)
if ((x + 2) > y)
عملگرهاي منطقي
عملگرهاي منطقي (logical operators) اجازه مي دهند دو يا چند عبارت رابطه اي را به يک عبارت که حاصل آن بولين است تبديل کنيد.
عملگرهاي منطقي ++C
عملگر سمبل مثال
AND && exp1 && exp2
OR || exp1 || exp2
NOT ! !exp1
عباراتي که توسط عملگرهاي منطقي بهم مربوط مي شوند مطابق جدول زير ارزيابي مي شوند.
نتيجه عبارت
اگر هردو عبارت exp1 و exp2 درست باشند نتيجه (1) true است (exp1 && exp2)
اگر عبارت exp1 يا exp2 يا هردو درست باشد نتيجه (1) true است (exp1 || exp2)
اگر exp1 درست باشد نتيجه (0) false و اگر غلط باشد نتيجه (1) true است (exp1!)
مثال.
(5 == 5) && (6 != 2) //True (1)
(5 > 1) || (6 < 1) //True (1)
(2 == 1) &&(5 == 5) //False (0)
!(5 == 4) //True (1)
يک سوال شرطي را توسط عملگرهاي منطقي به چندين طريق مي توان نوشت.
الويت عملگرهاي منطقي
الويت عملگرها
1 !
2 &
3 ||
عملگرهاي بيتي
عملگرهاي بيتي اجازه تغيير بيتهاي يک عدد صحيح را مي دهند. عملگرهاي بيتي مطابق با جبر بولي روي بيتهاي عملوندها کار مي کنند.
عملگرهاي بيتي ++C
عملگر سمبل عمل مثال
And & عملوند اول را بيت به بيت با عملوند دوم and مي کند exp1 & exp2
Or | عملوند اول را بيت به بيت با عملوند دوم or مي کند exp1 | exp2
Xor ^ عملوند اول را بيت به بيت با عملوند دوم xor مي کند exp1 ^ exp2
1’s Complement ~ مکمل 2 عملوند را مي گيرد ~exp1
Left Shift >> عملوند اول را به اندازه no به سمت چپ شيفت مي دهد exp1 << no
Right Shift << عملوند اول را به اندازه no به سمت راست شيفت مي دهد exp1 >> no
عملگرهاي انتساب ترکيبي
در ++C توسط عملگرهاي انتساب ترکيبي روش خلاصه تري براي نوشتن عبارات وجود دارد. به طور کلي عملگرهاي انتساب ترکيبي قاعده زير را دارند:
exp1 op= exp2
op يک عملگر دوتائي است.
مثال. دو جمله زير معادل هم هستند.
x = x + 5;
x += 5;
مثال. حاصل متغيرهاي x وz هردو برابر با 14 مي شود.
x = 12;
z = x += 2;
عملگر شرطي
عملگر شرطي تنها عملگر سه تائي در C++ است که سه عملوند دارد و فرم کلي آن به صورت زير است:
exp1 ? exp2 : exp3;
اگر حاصل عبارت exp1 درست باشد (غير صفر باشد) exp2 و اگر exp1 غلط باشد (برابر با صفر باشد) عبارت exp3 به عنوان نتيجه ارزيابي مي شود.
مثال. اگر y غيرصفر باشد مقدار 1 و اگر صفر باشد مقدار 100 به x اختصاص داده مي شود.
x = y ? 1 : 100;
مثال. عملگر شرطي مشابه يک جمله شرطي عمل مي کند.
z = (x > y) ? x : y;
که مشابه جمله شرطي زير است
if (x > y)
z = x;
else
z = y;
مثال. در عبارت زير a برابر با b مي شود اگر نتيجه کاهش b غيرصفر باشد. اگر نتيجه صفر شود a و b هردو برابر با مقدار -99 مي شوند
a = --b ? b : (b = -99);
عملگر کاما
در حالت هاي خاصي کاما (,) در نقش يک عملگر کار مي کند نه يک جداکننده. يک عبارت را مي توان با مربوط کردن دو زيرعبارت توسط کاما شکل داد. هر دو عبارت ارزيابي مي شود، ابتدا عبارت سمت چپ محاسبه مي شود و نتيجه عبارت سمت راست بعنوان نتيجه کلي عبارت ارزيابي مي شود.
مثال. جمله زير به a يکي اضافه مي کند و مقدار b را در x قرار مي دهد سپس آنرا افزايش مي دهد.
x = (a++ , b++);
عملگر sizeof
تعداد بايت هاي مورد استفاده هرمتغيريا نوع داده اي را مي توان توسط عملگر sizeof بدست آورد.
مثال. برنامه زير تعداد بايت هاي نوع هاي double و char را نمايش مي دهد.
#include
int main() {
cout << "sizeof(double) = " << sizeof(double);
cout << ", sizeof(char) = " << sizeof(char);
}
توجه داشته باشيد که sizeof يک تابع نيست و مي تواند بدون پرانتز هم استفاده شود.
عملگرهاي ++C در چند گروه قرار مي گيرند:
• عملگر انتساب
• عملگرهاي رياضي
• عملگرهاي رابطه اي
• عملگرهاي منطقي
وقتي عبارتي حاوي بيش از يک عملگر باشد به قواعدي نياز است که ترتيب انجام عملگرها را تعيين کند. اين قواعد الويت عملگر(operator precedence) ناميده مي شود. هر عملگر الويت خاصي دارد. عملگرهائي که الويت بيشتر دارند اول اجرا مي شوند.
با پرانتزها مي توان الويت عملگرها را درون عبارت تغيير داد. ارزيابي از داخلي ترين پرانتز شروع مي شود. از پرانتز براي روشن تر شدن ترتيب ارزيابي عملگرها استفاده کنيد.
اگر عبارت شامل چند عملگر با الويت يکسان باشد عملگرها از چپ به راست ارزيابي مي شوند.
بهتر است براي جلوگيري از ابهام يک عبارت پيچيده به چند عبارت ساده تر شکسته شود.
عملگر انتساب
عملگر انتساب (assignment operator) علامت مساوي (=) است. به معني اين است که عبارت سمت راست مساوي (يا rvalue) را به متغير سمت چپ مساوي (يا lvalue) تخصيص بدهد. فرم کلي آن به شکل زير است:
variable = expression;
عملگرهاي رياضي
عملگرهاي رياضي (mathematical operators) عمليات محاسباتي مانند جمع و تفريق را انجام مي دهند.
++C دو عملگر يکتائي و پنج عملگر دوتائي دارد. عملگرهاي يکتائي تنها يک آرگومان دارد مانند ++ و - - يعني تنها روي يک متغير عمل مي کنند. عملگرهاي دوتائي روي دو مقدار کار مي کنند مثل + و - .
عملگرهاي رياضي يکتائي ++C
عملگر سمبل عمل مثال
Increment ++ عملوند را يک واحد افزايش مي دهد ++x, x++
Decrement -- عملوند را يک واحد کاهش مي دهد --x, x--
عملگرهاي رياضي دوتائي ++C
عملگر سمبل عمل مثال
Addition + جمع دو عملوند x + y
Subtraction - تفريق عملوند اول از عملوند دوم x - y
Multiplication * ضرب دو عملوند x * y
Division / تقسيم عملوند اول بر علموند دوم x / y
Modulus % باقيمانده صحيح عملوند اول بر عملوند دوم x % y
عملگرهاي افزايش و کاهش تنها با متغيرها مي توانند استفاده شوند و با ثابت مجاز نيستند. اين عملگرها يک واحد از عملوند کم يا يک واحد به آن اضافه مي کنند. يعني عبارت ;++x معادل ;x=x+1 و عبارت ;--y معادل ;y=y-1 است.
توجه کنيد که عملگرهاي افزايش و کاهش مي توانند قبل يا بعد از علموند خود قرار گيرند. الويت ++ و - - بستگي به محل متغير دارد. وقتي عملگر بعنوان پيشوند استفاده مي شوند عملوند خود را قبل از استفاده تغيير مي دهند و وقتي به عنوان پسوند استفاده مي شوند عملوند خود را بعد از استفاده از آن تغيير مي دهند.
مثال. به دو مثال زير توجه کنيد.
x = 10;
y = x++; // x equals 11 and y equals 10
x = 10;
y = ++x; // x and y equal 11
عملگر منهاي يکتائي (-) عملوند خود را منفي مي کند. عملگر جمع يکتائي (+) تاثيري روي عملوند خود ندارد. کامپايلر از نحوه بکار بردن اين عملگرها د ر عبارت متوجه منظور شما مي شود.
مثال.
x = -a;
x = a * -b;
x = a * (-b); //This way is better
الويت عملگرهاي رياضي
الويت عملگرها
1 ++ --
2 * / %
3 + -
مثال. حاصل عبارت 12 % 5 * 2 برابر با 4 است.
مثال. حاصل عبارت زير 3- است.
x = 25 - (2 * (10 + (8 / 2)));
عملگرهاي رابطه اي
عملگرهاي رابطه اي (relational operators) در عبارات مقايسه اي استفاده مي شوند و يک مقدار بولين توليد مي کنند. عبارتي که داراي يک عملگر رابطه اي است به صورت true و false ارزيابي مي شوند. اگر رابطه درست باشد مقدار true يا 1 و اگر غلط باشد مقدار false يا 0 توليد مي شود.
بيشترين کاربرد عبارات رابطه اي در جملات شرطي است.
عملگرهاي رابطه اي ++C
عملگر سمبل عمل مثال
Equal == آيا عملوند اول مساوي عملوند دوم است x == y
Greater than < آيا عملوند اول بزرگتر از عملوند دوم است x > y
Less than > آيا عملوند اول کوچکتر از عملوند دوم است x < y
Less than or equal to => آيا عملوند اول کوچکتريا مساوي عملوند دوم است x <= y
Greater than or equal to =< آيا عملوند اول بزرگتريا مساوي عملوند دوم است x >= y
Not equal =! آيا عملوند اول نامساوي عملوند دوم است x != y
مثال. عبارات زير رابطه اي هستند.
5 == 1 //0 (false)
5 > 1 //1 (true)
5 != 1 //1 (true)
(5 + 10) == (3 * 5) //1 (true)
نکته. عملگر رابطه اي == را با عملگر = اشتباه نگيريد. يکي از متداولترين اشتباهات برنامه نويسان استفاده از علامت انتساب به جاي عملگر مساوي در عبارات شرطي است.
نکته. عباراتي که برابر مقداري غير صفر مي شوند به عنوان (1) true درنظر گرفته مي شوند.
مثال. با اجراي جمله زير هميشه پيغام نمايش داده مي شود زيرا مقدارx برابر با 5 مي شود و شرط هميشه درست مي شود.
if (x = 5)
cout<<"x is equal to 5";
الويت عملگرهاي رابطه اي
الويت عملگرها
1 =< => < >
2 =! ==
عملگرهاي رابطه اي الويت کمتري نسبت به عملگرهاي رياضي دارند.
مثال. دو شرط زير يکسان است.
if (x + 2 > y)
if ((x + 2) > y)
عملگرهاي منطقي
عملگرهاي منطقي (logical operators) اجازه مي دهند دو يا چند عبارت رابطه اي را به يک عبارت که حاصل آن بولين است تبديل کنيد.
عملگرهاي منطقي ++C
عملگر سمبل مثال
AND && exp1 && exp2
OR || exp1 || exp2
NOT ! !exp1
عباراتي که توسط عملگرهاي منطقي بهم مربوط مي شوند مطابق جدول زير ارزيابي مي شوند.
نتيجه عبارت
اگر هردو عبارت exp1 و exp2 درست باشند نتيجه (1) true است (exp1 && exp2)
اگر عبارت exp1 يا exp2 يا هردو درست باشد نتيجه (1) true است (exp1 || exp2)
اگر exp1 درست باشد نتيجه (0) false و اگر غلط باشد نتيجه (1) true است (exp1!)
مثال.
(5 == 5) && (6 != 2) //True (1)
(5 > 1) || (6 < 1) //True (1)
(2 == 1) &&(5 == 5) //False (0)
!(5 == 4) //True (1)
يک سوال شرطي را توسط عملگرهاي منطقي به چندين طريق مي توان نوشت.
الويت عملگرهاي منطقي
الويت عملگرها
1 !
2 &
3 ||
عملگرهاي بيتي
عملگرهاي بيتي اجازه تغيير بيتهاي يک عدد صحيح را مي دهند. عملگرهاي بيتي مطابق با جبر بولي روي بيتهاي عملوندها کار مي کنند.
عملگرهاي بيتي ++C
عملگر سمبل عمل مثال
And & عملوند اول را بيت به بيت با عملوند دوم and مي کند exp1 & exp2
Or | عملوند اول را بيت به بيت با عملوند دوم or مي کند exp1 | exp2
Xor ^ عملوند اول را بيت به بيت با عملوند دوم xor مي کند exp1 ^ exp2
1’s Complement ~ مکمل 2 عملوند را مي گيرد ~exp1
Left Shift >> عملوند اول را به اندازه no به سمت چپ شيفت مي دهد exp1 << no
Right Shift << عملوند اول را به اندازه no به سمت راست شيفت مي دهد exp1 >> no
عملگرهاي انتساب ترکيبي
در ++C توسط عملگرهاي انتساب ترکيبي روش خلاصه تري براي نوشتن عبارات وجود دارد. به طور کلي عملگرهاي انتساب ترکيبي قاعده زير را دارند:
exp1 op= exp2
op يک عملگر دوتائي است.
مثال. دو جمله زير معادل هم هستند.
x = x + 5;
x += 5;
مثال. حاصل متغيرهاي x وz هردو برابر با 14 مي شود.
x = 12;
z = x += 2;
عملگر شرطي
عملگر شرطي تنها عملگر سه تائي در C++ است که سه عملوند دارد و فرم کلي آن به صورت زير است:
exp1 ? exp2 : exp3;
اگر حاصل عبارت exp1 درست باشد (غير صفر باشد) exp2 و اگر exp1 غلط باشد (برابر با صفر باشد) عبارت exp3 به عنوان نتيجه ارزيابي مي شود.
مثال. اگر y غيرصفر باشد مقدار 1 و اگر صفر باشد مقدار 100 به x اختصاص داده مي شود.
x = y ? 1 : 100;
مثال. عملگر شرطي مشابه يک جمله شرطي عمل مي کند.
z = (x > y) ? x : y;
که مشابه جمله شرطي زير است
if (x > y)
z = x;
else
z = y;
مثال. در عبارت زير a برابر با b مي شود اگر نتيجه کاهش b غيرصفر باشد. اگر نتيجه صفر شود a و b هردو برابر با مقدار -99 مي شوند
a = --b ? b : (b = -99);
عملگر کاما
در حالت هاي خاصي کاما (,) در نقش يک عملگر کار مي کند نه يک جداکننده. يک عبارت را مي توان با مربوط کردن دو زيرعبارت توسط کاما شکل داد. هر دو عبارت ارزيابي مي شود، ابتدا عبارت سمت چپ محاسبه مي شود و نتيجه عبارت سمت راست بعنوان نتيجه کلي عبارت ارزيابي مي شود.
مثال. جمله زير به a يکي اضافه مي کند و مقدار b را در x قرار مي دهد سپس آنرا افزايش مي دهد.
x = (a++ , b++);
عملگر sizeof
تعداد بايت هاي مورد استفاده هرمتغيريا نوع داده اي را مي توان توسط عملگر sizeof بدست آورد.
مثال. برنامه زير تعداد بايت هاي نوع هاي double و char را نمايش مي دهد.
#include
int main() {
cout << "sizeof(double) = " << sizeof(double);
cout << ", sizeof(char) = " << sizeof(char);
}
توجه داشته باشيد که sizeof يک تابع نيست و مي تواند بدون پرانتز هم استفاده شود.