عملگرهاي رابطهاي (مقايسهاي)
عملگرهاي رابطهاي، همان طور كه از نامشان پيداست، رابطة بين دو مقدار را تعيين ميكنند. اين عملگرها در جدول 4ـ12 نشان داده شدهاند.
جدول 4ـ12 عملگرهاي رابطهاي
نام عملگر
نشانه
شکل
نتيجه
بزرگتر از
>
a > b
اگر a بزرگتر از b باشد، نتيجه 1 وگرنه 0 است.
كوچكتر از
<
a < b
اگر a كوچكتر از b باشد، نتيجه 1 وگرنه 0 است.
مساوي يا بزرگتر از
>=
a >= b
اگر a مساوي يا بزرگتر از b باشد، نتيجه 1 وگرنه 0 است.
مساوي يا كوچكتر از
=<
a<=b
اگر a مساوي يا كوچكتر از b باشد، نتيجه 1 وگرنه 0 است.
مساوي
= =
a = =b
اگر a مساوي b باشد، نتيجه 1 وگرنه 0 است.
مخالف
!=
a!=b
اگر a مخالف b باشد، نتيجه 1 وگرنه 0 است.
ايده و مفهوم اصلي در مورد عملگرهاي رابطهاي وابسته به مفهوم مقدار true و false است. در زبان C، true هر مقدار غير از صفر و false مقدار صفر است. عباراتي كه عملگرهاي رابطهاي يا منطقي را به كار ميبرند براي حالت نادرست يا false مقدار صفر و براي حالت درست يا true مقدار يك برميگردانند.
تقدم عملگرهاي رابطهاي پايينتر از تقدم عملگرهاي محاسباتي است. بنابراين دو عبارت
يكسان ارزيابي خواهند شد. همين طور عبارت a + b* c < d / h به صورت زير ارزيابي میشود.
کد:
(a +(b* c)) < (d / h)
ترتيب تقدم بين خود عملگرهاي رابطهاي به صورت جدول 4ـ13 است.
جدول 4ـ13 ترتيب تقدم عملگرهاي رابطهاي
> >= < <=
بالاترين تقدم
=! = =
پايينترين تقدم
در اينجا نيز مشابه عملگرهاي محاسباتي در مورد عملگرهاي همتقدم، عمليات از چپ به راست انجام ميگيرد.
مثال 4ـ16 به قطعه برنامة زير توجه کنيد.
عبارات رابطهاي، نتيجه 0 يا 1 ايجاد ميكنند. بنابراين قطعه برنامة بالا درست است و مقدار 1 را روي صفحة نمايش نشان خواهد داد.
مثال 4ـ17 با توجه به اعلان داده شده چندين عبارت مقايسهاي همراه با مقدار آنها در زير نمايش داده شده است.
کد:
int I = 1 , J = 2 , K = 3 ;
مقدار
تفسير
عبارت مقايسهاي
1
true
I = = 1
0
false
J != 2
1
true
I < J
1
true
(I+J) >= k
0
false
(J+k) > (k+5)
استفاده از پرانتز در اينجا ضروري نيست. پرانتز فقط خوانايي برنامه را بيشتر ميکند.
مثال 4ـ18 با توجه به اعلان داده شده چندين عبارت مقايسهاي همراه با مقدار آنها در زير نمايش داده شده است.
مقدار
تفسير
عبارت
1
True
B > 5
0
False
(A + B) <= 10
1
True
C = =119
1
True
’p’ C !=
0
False
(C >= 10 * (A + B
مثال 4ـ19 با توجه به اعلان داده شده، در جدول 4ـ14 نمونههايي از نحوة عملكرد مفسر با عبارات مقايسهاي پيچيده نشان داده شده است.
int j = 0 , m = 1 , n = -1 ;
float x = 2.5 , y = 0.0 ;
جدول 4ـ14
مقدار
عبارت معادل آن
عبارت مقايسهاي
0
j > m
j > m
1
((j= n)
j <= m >= n
1
((j
j <= x = = m
0
((-x)+j)= =((y>n)>=m)
-x+j = = y>n>m
3.5
x =(x+(y>=n))
x += (y>=n)
1
((++j) = = m) != (y*2)
++j = = m! =y*2
1
((j<=x) = = m
j <= x = = m
0
((-x)+y = =((y>n) > m
-x+y = = y>n>m
1.5
x = (x-(y>=n))
x -= (y>=n)
1
((++y) = = m != (y*2)
++y = = m != y*2
عملگرهاي منطقي
عملگرهاي منطقي به طور متعارف بر عملوندها يا عبارات منطقيای عمل میکنند كه دو ارزش درست يا true و نادرست يا false دارند. جدول 4ـ15 عملگرهاي منطقي را نشان ميدهد.در بين عملگرهاي منطقي، عملگر"!" بالاترين تقدم و عملگرد "| |" پايينترين تقدم را دارد.
جدول 4ـ15 عملگرهاي منطقي
نتيجه
شکل
علامت مفعول
عملگر
اگر a و b هر دو برابر يك يا غيرصفر (true) باشند، نتيجه برابر يك، در غيراين صورت برابر صفر خواهد بود.
a&&b
&&
و (AND) منطقي
اگر b يا a يا هر دو غيرصفر باشند، نتيجه برابر با يك، در غيراين صورت برابر صفر خواهد بود.
a | | b
| |
يا (OR) منطقي
اگر a برابر صفر (false) باشد، نتيجه برابر يك، در غير اينصورت صفر خواهد بود.
!a
!
نفي يا نقيض (NOT) منطقي
همانطور که در عملگرهاي رابطهاي بيان شد در زبان C ارزش نادرست يا false با مقدار صفر و ارزش درست يا true با مقادير غيرصفر مشخص ميگردد. عملگرهاي منطقي را در منطق رياضي به ترتيب با علايم "Ù"، "Ú" و "~" نمايش ميدهند و آنها را به ترتيب تركيب عطفي، تركيب فصلي، و نقيض يا نفي نامند. عملگرهاي منطقي، بيشتر به صورت تركيبي با عملگرهاي رابطهاي به كار میروند. در واقع عملگرهاي رابطهاي براي مقايسة ارزش دو عبارت هستند، درحالي كه عملگرهاي منطقي AND و OR براي اتصال دو عبارت ارزشي و در مورد NOT براي نفي آن به كار ميروند.
vمثال 4ـ20 با توجه به اعلان داده شدهجدول 4ـ16 مثالهايي از عبارات منطقي را همراه با معادل هر عبارت نشان ميدهد.
int j = 0 , m = 1 , n = -1 ;
float x = 2.5 , y = 0.0 ;
جدول 4ـ16
نتيجه
تفسير
عبارت معادل
عبارت منطقي
0
false
(j) && (m)
j && m
1
true
(j
j
1
true
(m+n) | | (!j)
m+n | | !j
1
true
((x*5)&&5) | | (m/n)
X*5 && 5 | | m/n
1
true
((j<=10)&&(x>=1))&&m
J<=10 && x>=1 &&m
0
false
((!x) | | (!n)) | | (m+n)
!x | | !n | | m+n
1
true
((x*y)<(j+m)) | | n
x *y
2
true + true
((x>y)+(!j)) | | (n+ +)
(x>y)+!j | | n++
2
true + true
(j | | m) + (x | | (+ +n))
(j | | m) + (x | | ++n)
معمولاً يك عبارت رابطهاي پيچيده، قسمت شرطي يك دستور حلقهای يا if را تشکیل ميدهد (دستور if را در فصل دستورهای کنترلي بررسي میکنیم). براي مثال عبارت
از نظر عملكرد معادل دستورهاي زير است.
و اين سازوکار تا جايي كه else وجود نداشته باشد درست است. به هرحال مجموعه دستورهاي
معادل دستورهاي زير نيست.
و براي اينكه ازنظر عملكرد همان نتايج به دست آيد، بايد آن را به صورت زير نوشت.
عملگر شرطي (:?)
عمليات شرطي ساده را عملگر شرطي انجام میدهد. اين عملگر سه عملوند دارد و شکل کلي آن در جدول 4ـ17 نشان داده شده است.
جدول 4ـ17
عملگر
علامت
شکل
نحوة عمل
شرطي
?:
a ? b: c
اگر a غيرصفر باشد، نتيجه b و گرنه نتيجه c است.
به عبارت ديگر شکل كلي عبارت شرطي به صورت زير است.
كه در آن ابتدا عبارت اول (exp1) ارزيابي ميشود، اگر نتيجة آن درست يا true (يعني مقدار آن غيرصفر) باشد، عبارت دوم (exp2) ارزيابي ميشود و مقدار عبارت شرطي برابر نتيجة ارزيابي عبارت دوم خواهد بود. ولي چنانچه عبارت اول نادرست يا false (يعني ارزش آن برابر صفر) باشد، عبارت سوم (exp3) ارزيابي ميشود و مقدار عبارت شرطي برابر نتيجة ارزيابي عبارت سوم خواهد بود.
در واقع عملگر شرطي، شکل كوتاه دستور کنترلي if...else است. براي مثال عبارت
را ميتوان بهاين صورت نوشت.
اولين عملوند، بررسی شرط است كه بايد از نوع اسكالر باشد. عملوندهاي دوم و سوم نتيجة نهاييعبارت را نشان ميدهندكه برحسبمقدار عملوند اول، فقطيكي از آندو انتخابميگردد. عملوندهاي دوم و سوم ممکن است از هر نوع دادهاي باشند تا جايي كه دو نوع، براساس قوانين طبيعي تبديل، سازگار باشند. براي مثال اگر عملوند دوم int و عملوند سوم double باشد، نتيجه بدون توجه به اينكه كدام انتخاب خواهد شد double خواهد بود (يعني اگر int انتخاب شود، به double تبديل خواهد شد).
v مثال 4ـ21 در عبارت شرطي زير فرض كنيد كه متغير i از نوع int باشد.
ابتدا عبارت (i<0) ارزيابي ميشود. اگر پاسخ true بود (يعني مقدار متغير i كوچكتر از صفر بود)، كل عبارت شرطي مقدار صفر را خواهد پذيرفت. در غير اين صورت (يعني اگر مقدار i كوچكتر از صفر نباشد)، كل عبارت شرطي مقدار 100 را خواهد پذيرفت.
عبارات شرطي، اغلب در طرف راست دستور انتساب ظاهر ميگردند، مانند مثال اول. در چنين مواردي، مقدار عبارت شرطي به متغير واقع در طرف چپ دستور انتساب اختصاص ميیابد.
مثال 4ـ22 به عبارت شرطي زير توجه کنيد.
کد:
min = (i<0) ? 0: 10 ;
در اينجا اگر متغير i منفي باشد، به متغير min مقدار صفر نسبت داده خواهد شد. وگرنه به متغير min مقدار 10 اختصاص خواهد يافت. عملگر شرطي تقدمي بالاتر از عملگرهاي انتساب دارد و شرکتپذيري آن از راست به چپ است.
مثال 4ـ23 به قطعه برنامة زير توجه کنيد.
کد:
int a =1 , b = 2 , c = 3 ;
c += (a > 0 && a<= 10) ? ++a: a/b ;
در اينجا مقدار عبارت شرطي برابر 2 ميشود و با توجه به عملگر انتساب جمع داريم
معمولاً اين عملگر خوانايي برنامه را كاهش ميدهد. لذا به جاي آن اغلب از دستور if else استفاده ميشود.
عملگر كاما
عملگر كاما "," اين امکان را ميدهد كه چندين عمل در يك دستور انجام شوند. نحوة عملكرد اين عملگر در جدول 4ـ18 نشان داده شده است.
جدول 4ـ18 شکل کلي عملگر كاما
عملگر
علامت
شکل
عمل
كاما
,
a , b ;
a ارزيابي ميشود، b ارزيابي ميشود، نتيجه b خواهد شد.
يك روش براي استفاده از عملگر كاما به صورت زير است.
کد:
; (عبارت2 , عبارت1) = متغير
در اينجا عملگر كاما موجب ميگردد كه ابتدا عبارت 1 و سپس عبارت 2 ارزيابي شود و نتيجة ارزيابي عبارت 2 به متغير مورد نظر نسبت داده شود. در اين گونه موارد معمولاً عبارت 1 و عبارت 2 با يكديگر مرتبطاند.
مثال 4ـ24 عبارت زیر را درنظر بگيريد.
در عبارت مزبور، ابتدا b برابر 5قرار داده ميشود و سپس عبارت b+15 محاسبه ميگردد كه نتيجة آن برابر 20 خواهد بود. در پايان، اين مقدار به متغير a نسبت داده ميشود، يعني پس از اجراي دستور مزبور مقدار a برابر 20 خواهد شد.
كاربرد ديگري از عملگر كاما در دستور forاست كه اين نوع كاربرد بيشتر متداول است و در فصل دستورهاي كنترلي بررسي میشود.
عملگرهاي حافظه
در زبان C چند عملگر وجود دارد كه اجازه ميدهند به خانههاي حافظه و محتواي آنها دستيابي داشته باشيد. با بعضي از اين عملگرها، مانند عملگر آدرس (يعني &)، آشنایيد. اين گونه عملگرها در جدول 4ـ19 نشان داده شدهاند.
جدول 4ـ19 عملگرهاي حافظه
نام عملگر
علامت عملگر
مثال
آدرس
&
&a
محتوا
*
*a
عضو آرايه
[ ]
a[2]
نقطه
.
a. b
پيكان راست
->
p-> a
خودآزمایی 4
<!--[if !supportLists]-->1. <!--[endif]-->برنامهاي بنويسيد كه عددي را بخواند و قدرمطلق آن را چاپ كند.
2. برنامهاي بنويسيد كه طبق فرمول زير درجه حرارت برحسب فارنهايت (F) را به درجه حرارت برحسب سیلسيوس (C) تبديل كند.
3. اگر b = 5 و a = 2، حاصل عبارت y = a*b + ++a + 10 ; چيست ؟
4. برنامهاي بنويسيد كه سه عدد از ورودي بگیرد و مشخص کند آيا اين اعداد ميتوانند اضلاع يك مثلث باشند يا خير.
5. دستورهای زير را به ترتيب اجرا کنید و در هر قسمت معادل بيتی و محتواي متغير x را مشخص سازيد.
کد:
printf ("%d" , x & y) ;
int x = 7 , y = 8 ;
printf ("%d" , x && y) ;
6. خروجي قطعه برنامة زير چيست ؟