عملگرها و عبارات
• قراردادهای نمادین
عملکرد برخی از عملگرها به انواع خاص عملوندها بستگی دارد. بنابراین، عملوندها به این صورت نشان داده میشوند:
عملگرها | کاربرد |
---|---|
e | هر عبارت؛ |
v | هر عبارتی که میتوان به آن مقدار اختصاص داد (عبارات "lvalue")؛ |
a | یک آرایه؛ |
f | یک تابع؛ |
s | یک نماد —که میتواند یک متغیر، یک ثابت یا یک تابع باشد. |
• عبارات
یک عبارت شامل یک یا چند عملوند با یک عملگر است. عملوند میتواند یک متغیر، یک ثابت یا عبارت دیگری باشد. یک عبارت که با یک نقطهویرگول دنبال میشود، یک دستور است.
لیست: مثالهایی از عبارات
v++
f(a1, a2)
v = (ia1 * ia2) / ia3
• عملیات حسابی
علامت | توضیحات |
---|---|
+ | e1 + e2 |
نتیجه جمع e1 و e2 | |
- | e1 - e2 |
نتیجه تفریق e1 و e2 | |
-e | |
نتیجه نفی حسابی a (مکمل دو). | |
* | e1 * e2 |
نتیجه ضرب e1 و e2. | |
/ | e1 / e2 |
نتیجه تقسیم e1 بر e2. نتیجه به نزدیکترین مقدار صحیح که کمتر یا مساوی خارج قسمت است گرد میشود. هر دو مقدار منفی و مثبت به سمت پایین گرد میشوند، یعنی به سمت −∞. | |
% | e1 % e2 |
نتیجه مدولوس (باقیمانده تقسیم) e1 بر e2. مدولوس همیشه یک مقدار مثبت است. | |
++ | v++ |
v را 1 واحد افزایش میدهد؛ نتیجه عبارت، مقدار v قبل از افزایش است. | |
++v | |
v را 1 واحد افزایش میدهد؛ نتیجه عبارت، مقدار v پس از افزایش است. | |
-- | v-- |
v را 1 واحد کاهش میدهد؛ نتیجه عبارت، مقدار v قبل از کاهش است. | |
--v | |
v را 1 واحد کاهش میدهد؛ نتیجه عبارت، مقدار v پس از کاهش است. | |
نکات: | عملگر یکانی + در pawn تعریف نشده است |
عملگرهای ++ و -- عملوند را تغییر میدهند. عملوند باید یک lvalue باشد. |
• دستکاری بیت
علامت | توضیحات |
---|---|
~ | ~e |
نتیجه مکمل یک e است. | |
>> | e1 >> e2 |
نتیجه شیفت حسابی به راست e1 به اندازه e2 بیت است. عملیات شیفت signed است: چپترین بیت e1 به بیتهای خالی در نتیجه کپی میشود. | |
>>> | e1 >>> e2 |
نتیجه شیفت منطقی به راست e1 به اندازه e2 بیت است. عملیات شیفت unsigned است: بیتهای خالی نتیجه با صفر پر میشوند. | |
<< | e1 << e2 |
نتیجه مقدار e1 شیفت داده شده به چپ به اندازه e2 بیت است؛ بیتهای سمت راست به صفر تنظیم میشوند. تفاوتی بین شیفت حسابی و منطقی به چپ وجود ندارد | |
& | e1 & e2 |
نتیجه "and" منطقی بیت به بیت e1 و e2 است. | |
| | e1 | e2 |
نتیجه "or" منطقی بیت به بیت e1 و e2 است. | |
^ | e1 ^ e2 |
نتیجه "exclusive or" بیت به بیت e1 و e2 است. |
• انتساب
نتیجه یک عبارت انتساب، مقدار عملوند سمت چپ پس از انتساب است. عملوند سمت چپ نمیتواند tag داشته باشد.
علامت | توضیحات |
---|---|
= | v = e |
مقدار e را به متغیر v اختصاص میدهد. | |
اگر "v" یک آرایه باشد، باید اندازه صریح داشته باشد و "e" باید یک آرایه با همان اندازه باشد؛ "e" ممکن است یک رشته یا یک آرایه لیترال باشد. | |
نکته | عملگرهای زیر یک انتساب را با یک عملیات حسابی یا بیتی ترکیب میکنند؛ نتیجه عبارت، مقدار عملوند سمت چپ پس از عملیات حسابی یا بیتی است. |
+= | v += e |
v را با a افزایش میدهد. | |
-= | v -= e |
v را با e کاهش میدهد | |
*= | v *= e |
v را در e ضرب میکند | |
/= | v /= e |
v را بر e تقسیم میکند. | |
%= | v %= e |
باقیمانده تقسیم v بر e را به v اختصاص میدهد. | |
>>= | v >>= e |
v را به صورت حسابی به اندازه e بیت به راست شیفت میدهد. | |
>>>= | v >>>= e |
v را به صورت منطقی به اندازه e بیت به راست شیفت میدهد. | |
<<= | v <<= e |
v را به اندازه e بیت به چپ شیفت میدهد. | |
&= | v &= e |
یک "and" بیتی به v و e اعمال میکند و نتیجه را به v اختصاص میدهد. | |
|= | v |= e |
یک "or" بیتی به v و e اعمال میکند و نتیجه را به v اختصاص میدهد. | |
^= | v ^= e |
یک "exclusive or" بیتی به v و e اعمال میکند و نتیجه را به v اختصاص میدهد. |
• رابطهای
یک "false" منطقی با یک مقدار صحیح 0 نشان داده میشود؛ یک "true" منطقی با هر مقداری غیر از 0 نشان داده میشود. نتایج مقدار عبارات رابطهای یا 0 یا 1 هستند، و tag آنها به "bool:" تنظیم میشود.
علامت | توضیحات |
---|---|
== | e1 == e2 |
اگر e1 برابر با e2 باشد، نتیجه یک "true" منطقی است. | |
!= | e1 != e2 |
اگر e1 با e2 متفاوت باشد، نتیجه یک "true" منطقی است. | |
نکته: | عملگرهای زیر ممکن است "زنجیرهای" شوند، مانند عبارت "e1 <= e2 <= e3"، با این معنی که نتیجه "1" است اگر همه مقایسههای فردی برقرار باشند و "0" در غیر این صورت. |
< | e1 < e2 |
اگر e1 کوچکتر از e2 باشد، نتیجه یک "true" منطقی است. | |
<= | e1 <= e2 |
اگر e1 کوچکتر یا مساوی e2 باشد، نتیجه یک "true" منطقی است. | |
> | e1 > e2 |
اگر e1 بزرگتر از e2 باشد، نتیجه یک "true" منطقی است. | |
>= | e1 >= e2 |
اگر e1 بزرگتر یا مساوی e2 باشد، نتیجه یک "true" منطقی است. |
• بولی
یک "false" منطقی با یک مقدار صحیح 0 نشان داده میشود؛ یک "true" منطقی با هر مقداری غیر از 0 نشان داده میشود. نتایج مقدار عبارات بولی یا 0 یا 1 هستند، و tag آنها به "bool" تنظیم میشود.
علامت | توضیحات |
---|---|
! | !e |
اگر e از نظر منطقی "false" بود، نتیجه یک "true" منطقی است. | |
| | e1 | e2 |
اگر e1 یا e2 (یا هر دو) از نظر منطقی "true" باشند، نتیجه یک "true" منطقی است. عبارت e2 فقط در صورتی ارزیابی میشود که e1 از نظر منطقی "false" باشد. | |
&& | e1 && e2 |
اگر هم e1 و هم e2 از نظر منطقی "true" باشند، نتیجه یک "true" منطقی است. | |
عبارت e2 فقط در صورتی ارزیابی میشود که e1 از نظر منطقی "true" باشد. |
• متفرقه
علامت | توضیحات |
---|---|
[] | a[e] |
شاخص آرایه: نتیجه cell e از آرایه a است. | |
{} | a{e} |
شاخص آرایه: نتیجه کاراکتر e از آرایه "packed" a است. | |
() | f(e1,e2,...eN) |
نتیجه مقداری است که توسط تابع f برگردانده میشود. تابع با آرگومانهای e1، e2، ... eN فراخوانی میشود. ترتیب ارزیابی آرگومانها تعریف نشده است (یک پیادهسازی ممکن است انتخاب کند که آرگومانهای تابع را به ترتیب معکوس ارزیابی کند). | |
? : | e1 ? e2 : e3 |
بسته به مقدار e1، نتیجه یا e2 یا e3 است. عبارت شرطی یک عبارت مرکب با یک عملگر دو قسمتی، "?" و ":" است. اگر e1 از نظر منطقی "true" باشد، عبارت e2 ارزیابی میشود، اگر e1 از نظر منطقی "false" باشد، e3 ارزیابی میشود. | |
: | tagname: e |
override تگ؛ مقدار عبارت e تغییر نمیکند، اما تگ آن تغییر میکند. برای اطلاعات بیشتر صفحه 68 را ببینید. | |
, | e1, e2 |
نتیجه e2 است، e1 قبل از e2 ارزیابی میشود. اگر در لیستهای آرگومان تابع یا یک عبارت شرطی استفاده شود، عبارت کاما باید در پرانتز محصور شود. | |
defined | defined s |
اگر نماد تعریف شده باشد، نتیجه مقدار 1 است. نماد ممکن است یک ثابت (صفحه 98)، یا یک متغیر سراسری یا محلی باشد. | |
تگ این عبارت bool: است. | |
sizeof | sizeof s |
نتیجه اندازه متغیر مشخص شده بر حسب "عناصر" است. برای متغیرهای ساده و برای آرایههایی با یک بعد، یک عنصر یک cell است. برای آرایههای چند بعدی، نتیجه تعداد عناصر آرایه در آن بعد است —[] را به نام آرایه اضافه کنید تا یک بعد پایینتر/جزئیتر را نشان دهید. اگر اندازه یک متغیر نامشخص باشد، نتیجه صفر است. | |
هنگام استفاده در یک مقدار پیشفرض برای یک آرگومان تابع، عبارت در نقطه فراخوانی تابع ارزیابی میشود، نه در تعریف تابع. | |
state | state s |
که در آن "s" نام یک state است که به صورت اختیاری با نام اتوماتون پیشوند شده است، این عملگر اگر اتوماتون در state مشخص شده باشد نتیجه مقدار 1 و در غیر این صورت 0 است. | |
تگ این عبارت bool: است. | |
tagof | tagof s |
نتیجه یک عدد منحصر به فرد است که نشاندهنده تگ متغیر، ثابت، نتیجه تابع یا برچسب تگ است. | |
هنگام استفاده در یک مقدار پیشفرض برای یک آرگومان تابع، عبارت در نقطه فراخوانی تابع ارزیابی میشود، نه در تعریف تابع. | |
char | e char |
نتیجه تعداد cell هایی است که برای نگهداری یک آرایه packed از e کاراکتر لازم است. |
• اولویت عملگر
جدول زیر عملگرها را با اولویت یکسان گروهبندی میکند، شروع با گروه عملگر با بالاترین اولویت در بالای جدول.
اگر ترتیب ارزیابی عبارت به صراحت توسط پرانتزها مشخص نشده باشد، توسط قوانین انجمنی تعیین میشود. به عنوان مثال: ab/c معادل با (ab)/c است به دلیل انجمن چپ به راست، و a=b=c معادل با a=(b=c) است.
علامت | توضیحات | انجمن |
---|---|---|
() | فراخوانی تابع | چپ به راست |
[] | شاخص آرایه (cell) | |
شاخص آرایه (کاراکتر) | ||
! | not منطقی | راست به چپ |
~ | مکمل یک | |
- | مکمل دو | |
++ | افزایش | |
-- | کاهش | |
: | override تگ | |
char | تبدیل تعداد کاراکترهای packed به cell ها | |
defined | وضعیت تعریف نماد | |
sizeof | اندازه نماد در "عناصر" | |
state | شرط اتوماتون/state | |
tagof | عدد منحصر به فرد برای تگ | |
* | ضرب | چپ به راست |
/ | تقسیم | |
% | مدولوس | |
+ | جمع | چپ به راست |
- | تفریق | |
>> | شیفت به راست | چپ به راست |
>>> | شیفت منطقی به راست | |
<< | شیفت به چپ | |
& | and بیتی | چپ به راست |
^ | exclusive or بیتی | چپ به راست |
| | or بیتی | چپ به راست |
< | کوچکتر از | چپ به راست |
<= | کوچکتر یا مساوی با | |
> | بزرگتر از | |
>= | بزرگتر یا مساوی با | |
== | برابری | چپ به راست |
!= | نابرابری | |
&& | and منطقی | چپ به راست |
|| | or منطقی | چپ به راست |
? : | شرطی | راست به چپ |
= | انتساب | راست به چپ |
*= /= %= += -= >>= >>>= <<= &= ^= |= | انتساب ترکیبی | |
, | کاما | چپ به راست |
نامهای تگ: 68
مثال: 77
همچنین صفحه 114 را برای مشخصکنندههای state ببینید