عملگرها نمادهايي هستند كه براي انجام اعمال خاصي مورداستفاده قرارميگيرند.
عملگرها در زبان C از تنوع زيادي برخوردارند . در C چهار دسته عملگر به نامهاي
( محاسباتي ، رابطه اي ، منطقي و دستكاري بيت ها ) وجود دارند كه آنها را بررسي
مي كنيم .
عملگرهاي محاسباتي
عملگرهاي محاسباتي كه در C مورد استفاده قرار مي گيرند در جدول (1) فهرست
شده اند .
رديف | عملگر | نام | مثال |
1 | - | تفريق و منهاي يكاني | |-xx/x-y
2 | + | جمع | | x+y
3 | * | ضرب | | x*y
4 | / | تقسيم | | x/y
5 | % | باقيمانده تقسيم | | x%y
6 | - - | كاهش يك واحد * | - -xيا xا - |-
7 | ++ + | افزايش يك واحد * | x+ + يا | + +xا
* decrement ** increment
جدول (1) . عملگرهاي محاسباتي
عملگرهاي رديف 1تا 4ا در جدول (1) تقريبا" در همه زبانهاي برنامه سازي وجود
دارند. عملگر % كه در بقيه زبانها با علامت ديگري ( مثلا" در بيسيك به صورت MOD)
وجود دارد باقيمانده تقسيم دو عدد را محاسبه مي كند : x= 13;
y= 5;
z= x%y;
اگر سه دستور فوق را توسط ماشين اجرا كنيم مقدار3 كه باقيمانده تقسيم 13 بر 5
است در z قرار مي گيرد .
عملگر كاهش ، يك واحد از عملوند مربوط كم مي كند . x= 10;
- - x;
دستور x - - از x يك واحد كم مي كند و نتيجه را در x قرار مي دهد كه معادل
دستور 1 + َx = x-1 است .
عملگر افزايش ، يك واحد به عملوند مربوطه اضافه مي كند : x= 40;
++x;
دستور ++x معادل دستور x = + 1 است كه موجب افزودن يك واحد به x مي شود .
عملگرهاي افزايش و كاهش يك واحد را مي توان بعداز عملوند مربوطه نيز به كار
برد مثل : x + + و - - x .
اگر در يك عبارت از عملگرهاي افزايش و كاهش يك واحد ، استفاده كنيم به كار
بردن اين عملگرها در قبل و بعد از عملوند مربوطه ، با يكديگر متفاوت است . بدين
معني كه اگر اين عملگرها قبل از عملوند باشند مقدار فعلي عملوند مورد استفاده
قرار گرفته و سپس عملگرها بر روي آن عمل ميكنند، ولي اگر بعد از عملوند مربوطه
باشند پس از انجام عمل افزايش و كاهش يك واحد به آنها مقادير جديد ، در عبارت
مورد استفاده قرار مي گيرند. استفاده ازعملگرهاي افزايش و كاهش يك واحد ، سرعت
محاسباتي را بالا مي برد .
اگر در يك عبارت از چند عملگر محاسباتي استفاده شود ، مساله تقدم عملگرها
مطرح مي شود . ( جدول (2) ) .
بالاترين تقدم - - | + + |
تفريق يكاني - | | * / % |
|
پايين ترين تقدم - | +
جدول (2) . تقدم عملگرهاي محاسباتي
همان طور كه در جدول (2) مشاهده مي شود ، عملگرهاي افزايش و كاهش يك واحد
داراي بالاترين تقدم و عملگرهاي جمع و تفريق داراي كمترين تقدم هستند و منهاي
يكاني ، داراي دومين تقدم است . عملگرهايي كه در يك سطر آمده اند ، مثل - و +
بدين معني است كه داراي تقدم مكاني نسبت به يكديگر هستند. در اين صورت هر كدام
از غملگرها كه اول ظاهر شود ، زودتر انجام خواهد شد .
عملگرهاي رابطه اي
عملگرهاي رابطه اي براي تشخيص ارتباط بين عملوندها يا مقايسه آنها مورد
استفاده قرار مي گيرند ( جدول (3) ) .
عملگر | نام | مثال |
> | بزرگتر | y >x | >
= >|> بزرگتر مساوي | =y >x | >
< | كوچكتر | y
= <|< كوچكتر مساوي | =y
== | = مساوي بودن | | x=x==y
!= | ! نامساوي | | x=x!=y
جدول (3) . عملگرهاي رابطه اي
نكته قابل ذك درمورد عملگرهاي رابطه اي اين است كه عملگر== براي تشخيص مساوي
بودن دو عبارت مورد استفاده قرار مي گيرد. اين عملگر با عملگر= كه براي انتساب
يك عبارت به يك متغير استفاده مي شود متفاوت است .
عملگرهاي منطقي
عملگرهاي منطقي ( جدول (4) ) بر روي عملوندهاي منطقي عمل ميكنند. عملوندهاي
منطقي داراي دو ارزش درستي و نادرستي هستند .
عملگر | نام | مثال |
&& | & و(AND) z || x
|| | | يا (OR) z || x
! | نقيض (NOT) | !x |
جدول (4) . عملگرهاي منطقي
ارزش نادرستي درزبان C با مقدار صفر و ارزش درستي با مقادير غيراز صفر مشخص
ميشود. عملگر منطقي ! داراي بالاترين تقدم و عملگر || داراي كمترين تقدم در بين
عملگرهاي منطقي هستند . چون عملگرهاي منطقي رابطه نزديكي با عملگرهاي رابطه اي
دارند مي توان تقدم آنها را نسبت به يكديگر بيان كرد ( جدول (5) ) .
بالاترين تقدم | ! | > >= < <= |
| == != |
| && |
|
پايين ترين تقدم | ||
جدول (5) . تقدم عملگرهاي منطقي و رابطه اي
عملگرهاي محاسباتي و رابطه اي با يكديگر تركيب شده و عملگرهاي ديگري را بنام
عملگرهاي محاسباتي رابطه اي ايجاد مي كنند ( جدول (6) ) . تقدم اين عملگرها از
ساير عملگرها پايين تر است .
عملگر | نام | مثال |
+= | + انتساب جمع | x+=y |
= | انتساب تفريق | x-=y |
*= | * انتساب ضرب | x*=y |
/= | / انتساب تقسيم | x/=y |
%= | % انتساب باقيمانده تقسيم | x%=y |
جدول (6) . عملگرهاي محاسباتي و رابطه اي
در جدول (6) ، عبارت x + = y معادل با x = x + y است و عبارت x % = y معادل y
x = x % است كه موجب انتساب باقيمانده تقسيم xبر yربه x مي شود : int a=10;
int b=20;
a+= b;
با اجراي دستورات فوق متغير a برابر30 خواهد بود. زيرا دستور a + = b معادل
دستور a = a + b است .
عملگر دستكاري بيت ها
ازآنجايي كه زبان C طوري طراحي شده است كه بتواند دربسياري ازموارد جايگزين
زبان اسمبلي گردد. بايد قادر باشد كليه اعمال ( يا حداقل بسياري از اعمال ) كه
در زبان اسمبلي قابل انجام هستند را انجام دهد . يكي از اعمالي كه در زبان
اسمبلي براحتي انجام پذير است . انجام اعمالي بر روي بيت هاي يك بايت يا يك
كلمه از حافظه است كه در زبان C براي انجام اين منظور از عملگرهايي استفاده
مي شود كه به عملگرهاي بيتي معروفند ( جدول (7) ) . اين عملگرها انجام اعمال
تست ، مقدار دادن و يا انتقال (shift) بيت ها را در يك بايت يا كلمه حافظه
امكان پذير مي نمايند. عملگرهاي بيتي فقط بر روي متغيرهايي از نوع charيا intا
عمل مي كنند و بر روي متغيرهايي از نوع float، double،، long double،، void، و
يا ساير متغيرها قابل اجرا نيستند . عملگرهاي بيتي &، |،و ~و(AND(، OR،و NOTو)
مشابه عملگرهاي منطقي AND، OR،و NOTو عمل مي كنند با اين تفاوت كه عمل آنها بر
روي يك بيت است . با فرض اين كه pو qو دو بيت مختلف باشند ، نحوه عمل عملگر ^
را در ذيل مشاهده مي نماييد .
p | q | p^q |
0 | 0 | 0 |
1 | 0 | 1 |
1 | 1 | 0 |
عملگرهاي بيتي در جدول (7) مشاهده مي شوند .
عملگر | نوع عمل |
& | AND ( و ) |
| | OR ( يا ) |
^ | XOR ( يا انحصاري ) |
~ | NOT ( نقيض يا متمم يك ) |
>> | انتقال به سمت راست (shift right) |
<< | انتقال به سمت چپ (shift left) |
جدول (7) . عملگرهاي بيتي
همان طور كه مشاهده شد ، نتيجه عملگر بيتي ^ وقتي يك (1) است كه يكي از
عملوندهاي آن صفر و ديگري يك باشد . به عبارت ديگر ، نتيجه عملگر بيتي ^ وقتي
صفر است كه هر دو عملوند آن صفر و يا هر دو يك باشند .
عملگرهاي &، |،و ^و و << ، >> بر روي دو عملوند عمل مي كنند اما عملگرهاي ~
به صورت ذيل به كار مي روند: >> و <<بر روي يك عملوند عمل مي كنند . عملگرهاي
متغير >>تعداد انتقال
متغير <<تعداد انتقال
و <<در روش كلي فوق ، متغير ، يك بايت يا كلمه اي از حافظه است كه عملگرهاي
بايد بر روي آن عمل كنند . تعداد انتقال عددي است كه مشخص مي كند بيت هاي >>"
متغير " بايد چند محل به سمت راست و يا چپ انتقال يابند . همان طور كه قبلا"
براي انتقال به چپ مورداستفاده << براي انتقال به راست و عملگر>>گفته شد عملگر
قرار مي گيرد . هر انتقال به چپ ، معادل با تقسيم كردن مقدار متغير به 2 و هر
انتقال به راست ، معادل ضرب كردن در 2 است .
مثال 1 :
تعداد عددي متغير | x مقدار بيتي متغير | x دستورات زبان | C
| char x; | | |
| x=7 ; | 00000111 | 7 |
| x<<1 ; | 00001110 | 14 |
| x<<3 ; | 01110000 | 112 |
| x<<2 ; | 11000000 | 192 |
| x>>1 ; | 01100000 | 96 |
| x>>2 ; | 00011000 | 24 |
همان طور كه مشاهده مي كنيد پس از اجراي دستور 2<< x< اطلاعات واقعي از بين
مي روند و مساله ضرب در 2 شدن ، در اينجا صدق نمي كند .
عملگر ~ در يك بايت يا كلمه حافظه ( يك متغير ) كليه بيت ها را نقيض ميكند.
يعني بيت صفر را به بيت يك و بيت يك را به بيت صفر تبديل مي نمايد . لذا اگر
اين عملگر دو بار بر روي يك متغير عمل كند وضعيت بيت هاي متغير به حالت اول
برمي گردند .
مثال 2 : x :00101100
~x :11010011
~x :00101100
همان طور كه مشاهده مي شود بيت هاي رديف اول و رديف آخر داراي يك وضعيت
ميباشند ( بيت هاي رديف آخر نتيجه دوبار اجراي عملگر نقيض بر روي متغير است ).
نكته اي كه در مورد عملگرهاي بيتي بايد در نظر داشت اين است كه اين عملگرها
معمولا" در مبدل هاي دستگاهها (device drivers) مورد استفاده قرار مي گيرند .
مثل برنامه هايي كه براي كار با modem و با چاپگر نوشته مي شوند . زيرا در اين
گونه موارد معمولا" تست كردن بيت هاي يك متغير مد نظر خواهد بود .
عملگر ?
عملگر ? با تست يك شرط ، مقداري را به يك متغير نسبت مي دهد . اين عملگر به
صورت زير استفاده مي شود : exp3
:= exp1 ? exp2 متغير exp1
، exp2،و exp3و سه عبارت هستند . نحوه عمل ? به اين صورت است كه : ابتدا
عبارت اول (exp1) ارزيابي مي شود چنانچه اين عبارت داراي ارزش true ( ارزش
درستي ) باشد مقدار exp2 پس از ارزيابي ، در متغير ذكر شده قرار مي گيرد وگرنه
عبارت سوم (exp3) ارزيابي شده و نتيجه آن به متغير ذكر شده منتقل مي شود . x= 10;
y= x>9 ? 100 :200;
نحوه عمل در دو دستور فوق به اين صورت است كه عبارت 9> x> ارزيابي مي شود .
چون اين عبارت يك ارزش منطقي true دارد ( 9> x> است ) لذا عدد 100 در متغير y
قرار مي گيرد .
عملگرهاي &و *و
عملگر & يك عملگر يكاني است كه آدرس عملوند خود را مشخص مي كند و به صورت
زير به كار مي رود : ;
نام عملوند &
مثل : int num;
p= #
با اجراي دستورات فوق آدرس متغير num در متغير p قرار مي گيرد. لذا عملگر &
به معني " آدرس " است . عملگر * همانند عملگر & يك عملگر يكاني است كه محتويات
يك آدرس حافظه را مشخص مي كند و به صورت زير به كار مي رود . ;
نام عملوند *
مثل : p= #
m= *p;
دستور اول ، آدرس متغير num را در p قرار ميدهد و دستور دوم ، محتويات محلي
را كه آدرس آن در p قرار دارد ( محتويات num ) ، را در m قرار ميدهد. بنابراين
مفهوم " * محتويات آدرس " مي باشد . دو دستور فوق معادل دستور m = num; است كه
موجب انتقال محتويات متغير num به متغير m مي شود .
عملگر كاما (/)
عملگر كاما براي انجام چند عمل در يك دستور ، به كار رفته و به صورت زير
استفاده مي شود :
( عبارت 2 و عبارت 1) =) متغير
عملگر كاما موجب مي شود تا " عبارت " 1 ارزيابي شده و سپس نتيجه ارزيابي "
عبارت " 2 با يكديگر ارتباط دارند . x =( y = 3 / y + 5);
ابتدا y باربر با 3 قرار مي گيرد و نتيجه عبارت y + 5 كه برابر 8 است در x
قرار خواهد گرفت .
عملگر sizeof
اين عملگر كه عملگر زمان ترجمه ناميده مي شود، براي محاسبه طول يك نوع و يا
يك متغير به كار رفته و به صورت زير استفاده مي شود . ;
(نوع) sizeof ;
متغير sizeof
اگر بخواهيم با استفاده از اين عملگرها، طول يك نوع مثل int، double و غيره
را محاسبه كنيم بايد آن را در داخل پرانتز قرار دهيم : اما اگر بخواهيم طول يك
متغير را محاسبه كنيم نيازي به استفاده از پرانتز نيست . به عنوان مثال : int a/ b/ c;
a= sizeof( int);
b= sizeof c;
دستور اول سه متغير a، b،ز cز را به صورت int تعريف مي كند . دستور دوم طول
نوع int را محاسبه كرده و در متغير a قرار مي دهد . دستور سوم طول متغير c را
محاسبه كرده و در متغير b قرار مي دهد. اين دستور براي مساله portability زبان C
بسيار مفيد است . بعنوان مثال ممكن است طول نوع int از ماشيني به ماشين ديگر
متفاوت باشد . نكته اي كه در مورد اين عملگر بايد توجه داشت اين است كه معمولا"
روش اول مورد استفاده قرار مي گيرد و روش دوم چندان جالب نيست .
تقدم عملگرها در حالت كلي
وقتي كه در يك عبارت چندين عملگر مورد استفاده قرار مي گيرند تقدم عملگر به
صورت جدول (8) خواهد بود .
بالاترين تقدم () | | ! ~ + + - - * & sizeof |
| * / % |
| + - |
| << >> |
| << = >> = |
| == =! |
| & |
| ^ |
| | |
| && |
| || |
| ? |
| = +=- = *= /= %= |
| / |
جدول (8) . تقدم عملگرها در حالت كلي
اگر در يك عبارت چندين عملگر وجود داشته باشد و درآن از پرانتز نيز استفاده
شود ، تقدم پرانتز از ساير عملگرها بيشتر بوده و عبارت داخل پرانتز زودتر
ارزيابي مي شوند .
مثال 3 : int x=5/ y=10/ k=4;
int s;
s= x*((x+y-)3)/k;
درنتيجه اجراي چند دستور فوق مقداري كه درs قرار مي گيرد برابر با 15 خواهد
بود . سپس عدد 3 از 15 كم مي شود كه 12 حاصل مي گردد و بعداز آن عمل ضرب انجام برابر با 60 ( 5 * 12 ) مي باشد و عملگر تقسيم (/) آخرين