فصل 4
عبارت، دستور، عملگر
هدف کلی
آشنایی با عبارتها، دستورهای ساده و ساختیافته، و عملگرهای مختلف
هدفهای رفتاری
انتظار میرود پس از خواندن این فصل دانشجو بتواند،
1. مفهوم عبارت را تعریف کند.
2. عبارتهای محاسباتی، قیاسی، و منطقی را بشناسد.
3. مفهوم دستور را تعریف کند.
4. انواع دستورهای ساده را بشناسد.
5. انواع دستورهای ساختیافته را بشناسد.
6. مفهوم عملگر را تعریف کند.
7. عملگرهای محاسباتی را بشناسد.
8. عملگرهای انتساب را بشناسد.
9. عملگرهای یکانی را بشناسد.
10. چند عملگر تکعملوندی را نام ببرد.
11. عملگرهای رابطهای (مقایسهای) را بشناسد.
12. عملگر منطقی را بشناسد.
13. عملگر شرطی را بشناسد.
14. عملگر کاما را بشناسد.
15. عملگرهای حافظه را بشناسد.
عبارت
در زبان برنامهنويسي، عبارت مجموعهاي معنيدار از دادهها (مقادير عددي و متغيرها) است كه با استفاده از نشانهها يا عملگرهاي محاسباتي، قياسي و منطقي با يكديگر تركيب شدهاند. در زبان C عبارات را به شکل زير دستهبندي میکنند.
عبارت محاسباتي
تركيبي از مقادير ثابت، متغيرهاي صحيح و اعشاري با استفاده از مجموعه عملگرهاي محاسباتي است كه با قاعدة خاصي تشكيل ميشود، مانند مثالهاي زير.
1. a * x + b
2. (a + b) / c
در مثال اول مقدار a در مقدار x ضرب و نتيجه با مقدار b جمع ميشود.
در مثال دوم ابتدا مقدار b با مقدار a جمع و سپس بر مقدار c تقسيم ميشود.
مثال 4ـ1 جدول 4ـ1 نمونههايي از عبارات محاسباتي را نشان میدهد.
جدول 4ـ1 چند عبارت محاسباتی

عبارات قياسي
عبارات قياسي تركيبي است از عبارات محاسباتي با استفاده از عملگرهاي قياسي و با رعايت قوانين مربوط به نحوة به كار بردن عملگرها. نتيجة حاصل از اجراي عبارت قياسي هميشه درست يا نادرست است؛ يعني، اگر شرط يا شرطهاي به كار رفته در عبارت قياسي برقرار باشد، نتيجة عبارت مزبور درست است وگرنه نادرست میشود، كه در اغلب زبانها (مانند پاسكال) آنها را به ترتيب true يا false نامند. ولي، در زبان C مقدار true برابر يك و مقدار false برابر صفر است. در عبارات قياسي حق تقدم اجرا، اول با عبارات محاسباتي است و سپس عمل مقايسة مورد نظر انجام ميگيرد.
مثال 4ـ2 نمونههايي از عبارات قياسي در جدول 4ـ2 نشان داده شده است.
جدول 4ـ2 چند عبارت قیاسی
|
معادل در زبان C |
عبارت رياضي |
|
|
a >15 |
a > 15 |
|
a+ b - c <= 3.14 |
a + b - c ≤ 3.14 |
|
|
3*a + b != 2 |
3a + b ≠ 2 |
|
|
|
|
|
عبارت منطقي
عبارت منطقي مجموعهاي از عبارات محاسباتي و قياسي است كه در آن حداقل يك عملگر منطقي نيز به كار رفته است. معمولاً اين گونه عبارات از دو گروه قبلي پيچيدهترند. در اغلب زبانها، عبارات قياسي كه در طرفين عملگر منطقي قرار ميگيرند بايد در داخل پرانتز محصور شوند.
مثال 4ـ3 نمونههايي از عبارات منطقي در جدول 4ـ3 نشان داده شده است.
جدول 4ـ3 چند عبارت منطقی
|
معادل در زبان C |
عبارت رياضي |
|
(a<5) && (a>3) يا (a>3) && (a<5) |
5 > a > 3 |
|
(a <= 3.14) | | (a>=15) |
(a ≤ 3.14)
a ≥ 15 |
دستور
دستور حكمي است كه سبب ميشود كامپيوتر عملي انجام دهد. دو گروه دستور داریم: دستورهاي ساده و دستورهاي ساختيافته.
دستورهاي ساده
دستورهاي ساده دستورهاي غيرشرطياند كه متداولترين آنها عبارتاند از:
- جايگزين كردن مقداري معين به يك متغير كه به آن دستور انتساب ميگويند.
- خواندن و نوشتن
- فراخواني تابع
- انتقال كنترل به نقطهاي از برنامه
مثال 4ـ4 نمونههايي از دستورهای ساده در زير نشان داده شده است.
A = B * C ;
scanf("%d%d ", &a , &b) ;
printf("%d%f",a , b) ;
fact(b) ;
goto a ;
دستورهاي ساختيافته
دستورهاي ساختيافته دستورهايياند كه از انواع ساختارهاي الگوريتمي ساخته شدهاند و متداولترين آنها عبارتاند از:
- دستور مركب كه شامل دو يا چند دستور متوالي است و در داخل يك زوج آكولاد محصور است. در زبان C هر دستور ساده به يك سميكولون ختم ميشود.
{
scanf("%d %d" , &a , &b) ;
s = a * b ;
p = 2 * (a+b) ;
printf("%d %d", s , p) ;
}
- دستور حلقة تكرار
for (i =0 ; i<=10 ; i++)
sum = sum + i ;
- دستور شرطي.
if (a>b)
c = a + b ;
else
c = a – b ;
عملگر
عملگر يا اپراتور نشانههايياند كه در عبارات به كار ميروند و به كمك آنها ميتوان اعمالي را روي انواع داده انجام داد. انواع عملگرها عبارتاند از: محاسباتی، انتساب، یکانی، رابطهای (مقایسهای)، منطقی، شرطی، کاما، و حافظه.
عملگرهای محاسباتی
فهرست عملگرهاي محاسباتي در جدول 4ـ4 نشان داده شده است.
جدول 4ـ4 عملگرهاي محاسباتي
|
نام عملگر |
نشانه |
شکل |
نوع عمل |
|
جمع |
+ |
a + b |
a جمع با b |
|
تفريق |
ـ |
a - b |
a منهاي b |
|
منهاي يكاني |
ـ |
-a |
منهاي a |
|
جمع يكاني |
+ |
+a |
مقدار عملوند a |
|
ضرب |
* |
a * b |
a ضرب در b |
|
تقسيم |
/ |
a / b |
a تقسيم بر b |
|
باقيماندة تقسيم |
% |
a % b |
باقيماندة تقسيم a بر b |
|
يك واحد افزايش |
++ |
a++ , ++a |
افزايش يك واحد به مقدار a |
|
يك واحد كاهش |
-- |
a-- , --a |
كاهش يك واحد از مقدار a |
چهار عملگر / , * , - , + تقريباً روي همه نوع دادههاي استاندارد موجود در زبان C به كار میرود. در صورتي که عملگر "/" روي مقادير صحيح يا كاراكتر به كار رود، جزء اعشار حذف ميشود. مثلاً مقدار 10/3برابر 3 خواهد بود يعني فقط جزء صحيح آن درنظر گرفته خواهد شد و قسمت اعشار بريده ميشود.
عملگر % باقيماندة تقسيم را به دست ميآورد و هر دو عملوند آن بايد مقدار صحيح باشد. مثلاً مقدار 10%3 برابر يك خواهد بود. يعني باقيماندة تقسيم 10 بر 3 مساوي يك است.
دو عملگر ++ و -- در ساير زبانهاي برنامهنويسي وجود ندارند. عملگر ++ يك واحد به عملوند خود اضافه ميكند و عملگر -- يك واحد از عملوند خود كم ميكند. هر دو عملگر تكعملوندياند. درواقع دو دستور+ +a ; و a+ + ;معادل اين دستورند: a = a + 1 ;.همچنين دو دستور – –a ; و a– – ;معادل اين دستورند a = a – 1 ; .
توجه داشته باشيد سرعت عمل دو عملگريکاني ++ و -- از سرعت عمل عملگر انتساب (يعني عملگر =) بالاتر است.
مثال 4ـ5 به خروجي قطعه برنامة زير توجه کنيد.
a = 5 ;
printf ("%d %d\n", a , a+ +) ;
printf ("%d", a) ;
مثال 4ـ6 به خروجي قطعه برنامة زير توجه کنيد.
a = 5 ;
printf ("%d %d\n", a , + +a) ;
printf ("%d", a) ;
با توجه به دو مثال بالا ملاحظه ميکنيد که از نظر کاربرد دو دستور + +a ; و a+ + ; با يکديگر تفاوت دارند؛ يعني، در مثال اول با اجراي دستور printf اولي مقدار a (كه مساوي 5 است) چاپ ميشود و سپس دوباره همان مقدار a چاپ ميگردد و پس از انجام عمل چاپ مقدار آن يك واحد افزايش مييابد. با اجراي دستور printf دوم كنترل به آغاز خط جديد انتقال مييابد، سپس مقدار a كه اكنون برابر 6 است چاپ ميشود. در مثال دوم با اجراي دستور printf اولي مقدار a (كه مساوي 5 است) چاپ و سپس دستور + +a اجرا ميشود؛ يعني، به a يك واحد افزوده ميشود بعد مقدار آن كه برابر 6 شده است چاپ ميشود. دستور printf دوم در اينجا نيز مشابه مثال اول عمل ميكند. عملكرد دو دستور --a و a-- نيز به همين روش است.
ترتيب تقدم اين گروه از عملگرها در جدول 4ـ5 نشان داده شده است.
جدول 4ـ5 ترتیب تقدم عملگرها
|
-- ++ |
بالاترين تقدم |
|
ـ |
|
|
* / % |
|
|
- + |
پايين ترين تقدم |
در مورد عملگرهاي همتقدم ترتيب تقدم از چپ به راست است. درصورت وجود پرانتز، تقدم پرانتز از تقدم همة عملگرها بالاتر است.
مثال 4ـ7 با توجه به مقادير داده شده، چند عبارت محاسباتي همراه با مقادير آنها در جدول 4ـ6 نشان داده شده است.
int a = 10 , b = 3 ;
float C = 12.5 , d = 2.0 ;
جدول 4ـ6
|
مقدار |
عبارت محاسباتي |
مقدار |
عبارت محاسباتي |
|
14.5 |
C + d |
13 |
a + b |
|
10.5 |
C - d |
7 |
a - b |
|
25.0 |
C * d |
30 |
a * b |
|
6.25 |
C / d |
3 |
a / b |
|
error |
C % d |
1 |
a % b |
مثال 4ـ8 با توجه به اعلان داده شده، چند عبارت محاسباتي همراه با مقادير آنها در جدول 4ـ7 نشان داده شده است.
char c1 = 'A' , c2 = 'E' ;
جدول 4ـ7
|
مقدار |
عبارت محاسباتي |
|
65 |
c1 |
|
134 |
c1 + c2 |
|
139 |
c1 + c2 + 5 |
|
187 |
’5’ c1 + c2 + |
در عبارات مورد نظر هر كجا c1 و c2 به كار رفته، به جاي آنها کد اسكي معرف كاراكتر مربوط به آنها به كار برده شده است؛ يعني، در مورد متغير c1 كه معرف كاراكتر A است عدد 65 (کد اسكي حرف A) و در مورد متغير c2 نيز كه معرف كاراكتر E است عدد 69 (کد اسكي حرف E) به كار برده شده است. همچنين ملاحظه ميکنيد كه عدد 5، با کاراکتر 5 که کد اسكي آن 53 است تفاوت دارد.
مثال 4ـ9 با توجه به اعلان داده شده چند عبارت محاسباتي همراه با مقادير آنها در جدول 4ـ8 نشان داده شده است.
int a = 11 , b = -3 ;
جدول 4ـ8
|
مقدار |
عبارت محاسباتي |
|
8 |
a + b |
|
14 |
a - b |
|
-33 |
a * b |
|
-3 |
a / b |
|
2 |
a % b |
در مثال بالا اگر مقدار a برابر -11 و مقدار b برابر 3 باشد، مقدار a / b باز هم برابر -3 ميشود، اما مقدار a % b برابر -2 خواهد شد. به طريق مشابه اگر a و b هر دو مقدار منفي (متناظراً -11 و -3) داشتند، مقدار a / b برابر 3 ميشد، ولي مقدار a % b باز هم برابر -2 باقي ميماند.
عملگرهاي انتساب
در زبان C علامت ’=’ به مفهوم مساوي نيست، بلكه عملگر جايگذاري يا عملگر انتساب است. اين عملگر موجب ميگردد كه مقدار عملوند سمت راست آن در محل حافظهاي كه با عملوند سمت چپ مشخص شده است قرار گيرد. براي مثال دستور K = 123 ; مقدار 123 را به متغير k اختصاص ميدهد؛ يعني، آنچه در سمت چپ علامت قرار دارد، نام يك شناسه يا متغير و آنچه در سمت راست آن قرار دارد، مقدار يا value متغير مزبور است. پس دستور بالا به مفهوم k " مساوي 123 " نیست بلکه یعنی "مقدار 123 به k اختصاص داده شود". پس بايد به تمايز بين نام متغير و مقدار متغير توجه كرد.
حال دستور متعارف K = K+1 ; را درنظر بگيريد. از نظر رياضي اين دستور مفهوم نيست. اما از ديدگاه برنامهسازي، دستور مزبور دستور جايگذاري و بدين مفهوم است كه متغيري را كه نام آن K است پيدا كنيد. سپس به مقدار آن يك واحد اضافه کنید و مقدار جديد را به متغيري كه نام آن K است (درواقع به همان متغير) اختصاص دهيد.
به طور كلي در زبان C چندين عملگر مختلف انتساب يا جايگذاري وجود دارد كه همة آنها براي تشكيل يك عبارت انتساب يا عبارت جايگذاري به كار میروند و مقدار يك عبارت را به يك شناسه يا متغير اختصاص يا نسبت ميدهند. متداولترين عملگر انتساب عملگر ’=’ است. فرم كلي دستور انتساب به صورت زير است.
identifier = expression ;
variable = expression ;
توجه داشته باشيد كه عملگر انتساب، يعني ’=’، كاملاً با عملگر مساوي كه علامت ’= =’ است فرق دارد. عملگر انتساب براي اختصاص و نسبت دادن يك مقدار به يك شناسه يا متغير به كار میرود، درحالي كه عملگر تساوي يا برابري، براي تعيين اينكه آيا دو عبارت مقدار يكسان دارند يا نه به كار ميرود. پس اين دو عملگر نميتوانند به جاي يكديگر به كار روند.
اگر دو عملوند عملگر انتساب از نظر نوع يكسان نباشند، مقدار عبارت يا عملوند طرف راست به طور خودكار به نوع شناسه يا متغير طرف چپ عملگر تغيير مييابد. بنابراين اگر نتيجة عبارت سمت راست عملگر مزبور از نوع float و عملوند سمت چپ آن از نوع int باشد، جزء اعشاري آن حذف خواهد شد.
مثال 4ـ10 با توجه به اعلان داده شده، نمونههايي از دستور انتساب در جدول 4ـ9 نشان داده شده است.
int a , b = 5 ;
جدول 4ـ9
|
مقدار |
عبارت |
مقدار |
عبارت |
|
-25 |
a = -25.9 ; |
5 |
a = 5.56 ; |
|
5 |
a = 2*b /2 ; |
2 |
a = b/2 ; |
|
4 |
a = 2*(b/2) ; |
120 |
;’x’a = |
|
-3 |
-52’0’ -’a’ a = |
48 |
;’0’ a = |
|
47 |
3/’B’-’E’ a = |
32 |
’ ’ a = |
ملاحظه ميکنید كه در عبارات بالا در مورد كاراكترها، کد اسكي آنها جايگزين ميشود. مثلاً در آخرين عبارت، به جاي E و B به ترتيب مقادير 69 و 66 قرار ميگيرد و در نتيجه
69 - 66/3 = 69-22 = 47.
همچنين در عبارت a = 2 * (b/2) ; از آنجايي که پرانتز تقدم بالاتري دارد، اول مقدار b/2 محاسبه ميشود كه نتيجة آن برابر 2 خواهد شد و سپس نتيجة حاصل در 2 ضرب ميشود و بنابراين نتيجة نهايي برابر 4 خواهد شد.
در زبان C ميتوان دستورهاي انتساب چندگانه به كار برد مانند a = b = 5 ;. شکل كلي اين گونه دستورهاي انتساب به صورت زير است.
V1 = V2 =... = Vn = expression ;
در چنين حالتي، تقدم عمل انتساب از راست به چپ است. بنابراين دستور a = b = c = 5 ; معادل
a = (b = (c = 5)) ; است.
در زبان C، ميتوان عملگر انتساب را با عملگرهاي محاسباتي تركيب كرد و عملگرهاي+ = ، -، = ، *= ، /= ، %= را به دست آورد که آنها را عملگرهاي محاسباتي انتساب نامند و در جدول 4ـ10 نشان داده شدهاند.
جدول 4ـ10 عملگرهاي محاسباتي انتساب
|
عملگر |
نام عملگر |
دستور انتساب |
معادل |
|
+ = |
انتساب جمع |
a += b ; |
a = a+b ; |
|
-= |
انتساب تفريق |
a -= b ; |
a = a-b ; |
|
*= |
انتساب ضرب |
a *= b ; |
a = a*b ; |
|
/= |
انتساب تقسيم |
a /= b ; |
a = a/b ; |
|
%= |
انتساب باقيماندة تقسيم |
a %b ; |
a = a%b ; |
مثال 4ـ11 اگر متغيرهاي a و b از نوع int باشند و مقدار آنها به ترتيب برابر 10 و 5 باشد، دستور a += b ; معادل دستور a = a + b ; است؛ يعني، a = 15.
عملگرهاي يكاني
زبان C مجموعهای عملگر دارد كه فقط روي يك عملوند عمل ميكنند و آنها را عملگرهاي يكاني يا تكعملوند نامند. اين عملگرها اغلب در جلوي عملوند خود قرار ميگيرند. متداولترين عملگر تكعملوندي علامت منفي است كه در جلوي يك مقدار ثابت عددي، يا يك متغير و يا يك عبارت قرار ميگيرد.
مثال 4ـ12 در زير نمونههايي از عملگر منهاي يکاني نشان داده شده است.
–915 – 3.1415 – 10.25 –2e –4
–sum – (x+y) –3 * (x + y)
اگر جلوي مقادير علامتي قرار نگيرد، علامت آنها مثبت در نظر گرفته ميشود، ولي به هرحال ميتوان جلوي آنها يك علامت "+" قرار داد كه در اين صورت "+" را كه فقط داراي يك عملوند است جمع يكاني نامند.
مثال 4ـ13 در زير نمونههايي از عملگر جمع يکاني نشان داده شده است.
+915 +3.1415 +10.25 +2e – 4
+sum +(x+y) +3 * (x + y)
اگر عملگر مزبور به كار نمیرفت، مقدار اقلام بالا باز هم تغيير پيدا نميكرد و به همين دليل كاربرد اين عملگر متداول نيست.
از عملگرهاي تكعملوندي ديگر عملگر "cast" است كه آن را عملگر تبديل نوع نيز گويند و در خودآزمایی 2 فصل 3 بررسي کردیم.
يكي ديگر از عملگرهاي تكعلموندي عملگر sizeof است كه بزرگي عملوند خود را برحسب بايت برميگرداند. عملوند اين عملگر معمولاً با نوع داده همراه است، مانند
int , unsignded int , long , float , unsigned
و مشابه آنها، كه در اين صورت عملگر مزبور بزرگي اين نوع ساختمان دادههاي استاندارد را برميگرداند، يا اينكه عملوند آن عبارت است كه در اين صورت بزرگي آن عبارت را برحسب بايت برميگرداند. جدول 4ـ11 نحوة كاربرد اين عملگر را نشان ميدهد.
جدول 4ـ11 کاربرد عملگر sizeof
|
نام عملگر |
نشانه |
شکل |
نوع عمل |
|
بزرگي (sizeof) |
sizeof |
sizeof (t)
sizeof x |
بزرگي نوع داده t يا عبارت
x را برحسب بايت برميگرداند. |
مثال 4ـ14 به دستورهای زير توجه کنید.
k1 = sizeof (char) ;
k2 = sizeof (short) ;
k3 = sizeof (float) ;
k4 = sizeof (int);
k5 = sizeof (int *) ;
k6 = sizeof (double) ;
با اجراي دستورهاي بالا مقادير k3 , k2 , k1 بهترتيب برابر 4 , 2 , 1 خواهد بود كه بهترتيب معرف طول نوع داده char و short و float است. در مورد k4 نيز اگر نوع int گونهاي از زبان C به طول 2 بايت باشد، مقدار k4 برابر 2 خواهد بود و اگر به طول 4 بايت باشد، مقدار آن 4 خواهد بود. k5 نيز بزرگي يك اشارهگر به يك داده از نوع integer است كه برحسب ماشين مورد نظر ممكن است 4 بايت و يا عدد ديگري باشد.
مثال 4ـ15 درنتيجة اجراي دو دستور زير
float a ;
printf ("%d%d", sizeof a , sizeof (float)) ;
مقادير 44 نمايش داده خواهد شد، كه 4 اول معرف طول متغير a است (كه از نوع float است) و 4 دوم معرف طول نوع داده float است. درضمن ملاحظه ميگردد كه اگر عملوند اين عملگر معرف نوع داده مانند int، float باشد، عملوند در داخل پرانتز محصور ميگردد و اگر معرف متغير (مانند a در مثال بالا) باشد، نياز نيست كه در درون زوج پرانتز قرار داده شود.
يكي ديگر از عملگرهاي متداول تكعملوندي عملگر منطقي "!" به مفهوم نقيض است كه در عملگرهاي منطقي توضيح میدهیم.