تماس درباره   صفحه اصلی
  زبان ++C > عملگرها و عبارات  
 
 

عملگرها و عبارات


هر برنامه از statement ها تشکيل شده است و statement از عبارات (expressions) و عملگر (operators) تشکيل شده است. در اين بخش ياد خواهيد گرفت statement و expression چيست،‌ عملگرهای ++C کدامند و الويت آنها چگونه است.

Statement
Expression
عملگرها
تبديل نوع


Statement

يک جمله (statement) يک خط منفرد از کد است که عملي را انجام مي دهد. در ++C معمولا هر جمله در يک خط نوشته می شود، البته بعضی از جملات به چند خط تقسیم می شوند.

جملات هميشه به يک سميکولن (;) ختم می شوند. (به استثنای راهنماهای کامپايلر مانند define# و include#).


مثال. چند جمله در C++.

int i_accnum;
i_accnum=55555;
i_accnum=i_accnum+5;


White space

خطوط خالی و فاصله ها در برنامه white space نام دارند. کامپايلرهای C++ نسبت به خطوط خالی حساس نيستند و وقتی کد برنامه را می خوانند در جستجوی کاراکترهای جمله و ختم شدن به سميکولن هستند و فاصله ها را نديده می گيرند (ثابت های رشته ای مستثنا هستند). White space امکان فرمت بندی کد برنامه با يک طرح استاندارد برای فاصله گذاری را می دهد که باعث می شود کد برنامه خواناتر شود بدون اينکه روی اجرای آن تاثير بگذارد. هر برنامه نويسی استيل خود را ممکن است داشته باشد مهم اين است که کد برنامه خوانا باشد.

White space ها در ثابت های رشته ای که بين علامت گيومه (") قرار می گيرند مجاز نيستند. اگر می خواهيد يک رشته را به دو خط بشکنيد بايد از کاراکتر (\) استفاده کنيد.


مثال. جملات زير با هم معادل هستند.

x=2+3;

x = 2 + 3;

x   =
2
+
3;

مثال. جمله زير زير درست است.

cout<<"Hello \
world!";


جملات پوچ

يک سميکولن تنها در يک خط خالی يک جمله پوچ (null statement) را می سازد که عملی انجام نمی دهد. گاهی جملات پوچ می توانند مفيد باشند.

جملات ترکيبی

جمله ترکيبی (compound statement) که بلاک (block) هم ناميده می شود از يک يا چند جمله که بين آکولاد محصور شده اند تشيل شده است.

بلاک می تواند جايگزين هر جمله ای در برنامه بشود. برای شروع بهتر است آکولاد بلاک در خط جداگانه ای باشد تا تشخيص اينکه جا افتاده است آسان تر باشد.


مثال. يک بلاک از کد.

{
   cout<<"Hello, ";
   cout<<"world!";
}


Expression

يک عبارت (expression) ارزيابی شده و نتيجه آن به متغيری نسبت داده می شود. هر عبارت ممکن است شامل متغير، ثابت، عملگر و پرانتز باشد.

عبارات ساده

ساده ترين عبارت از يک بخش تشکيل شده است: يک متغير، ثابت واقعی يا ثابت سمبليک.


مثال. هرکدام از موارد زير يک عبارت ساده هستند.

PI
20
rate
-1.25


عبارات کامل

يک عبارت کامل (Complex expression) از عبارات ساده که با عملگر به هم مربوط شده اند تشکيل شده است.


مثال. چند عبارت کامل.

2 + 8
1.25 / 8 + 5 * rate + rate * rate / cost
x = a + 10;
y = x = a + 10;
x = 6 + (y = 4 + 5);


وقتی عبارتی شامل چند عملگر است ارزيابی عبارت وابسته به الويت عملگرهاست.


عملگرها

عملگرها (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 <iostream>
int main() {
cout << "sizeof(double) = " << sizeof(double);
cout << ", sizeof(char) = " << sizeof(char);
}


توجه داشته باشيد که sizeof يک تابع نيست و می تواند بدون پرانتز هم استفاده شود.


عملگرهای آدرس (&) و اشاره گر (* و <-) در بخش اشاره گرها توضيح داده خواهند شد.


جدول الويت کليه عملگرهای ++C


تبديل نوع

کامپايلر به طور خودکار يک نوع داده را درصورت نياز به ديگری تبديل می کند. مثلا اگر يک عدد int در متغير float ذخيره شود کامپايلر مقدار را به float تبديل می کند. هميشه نوع کوچکتر به نوع بزرگتر تبديل می شود. اگر يک عدد float با double جمع شود با هردو به عنوان double برخورد می شود.

اگر سعی کنيد مقدار بزرگتری را در متغير کوچکتر ذخيره کنيد بخشی از داده ممکن است از دست برود و احتمالا با يک پيغام هشدار مواجه خواهيد شد.


مثال.

char a='2';
int b= a+ 9;

const int big=110232343;
const short int small=big;


اگر برنامه نويس بخواهد صريحا عمل تبديل نوع را انجام دهد از casting استفاده می کند. برای اين کار نوع داده مورد نظر را درون پرانتز سمت چپ مقدار قرار دهيد. مقدار می تواند متغير، ثابت،‌ حاصل يک عبارت يا مقدار برگشتی يک تابع باشد.


مثال.

int b = 200;
unsigned long a = (unsigned long int)b;


در C++ راه ديگری هم برای تبديل نوع وجود دارد. در اين روش مانند فراخوانی توابع پرانتز اطراف مقدار قرار می گيرد.

مثال.

float a = float(200);
// This is equivalent to:
float b = (float)200;

البته در مثال فوق نوشتن 200f به تنهائی کفايت می کند.


 


 


صفحه اصلی| PDF| درباره| تماس