پنج شنبه , ۲۷ تیر ۱۳۹۸
آخرین مطالب
LINK TABLES
خانه | برنامه‌نویسی | زبان C – عملگرها (جلسه ۸)

زبان C – عملگرها (جلسه ۸)

درود. دوستای خوبم امیدوارم که حالتون خوب باشه و توی مسیربرنامه نویسی هر روز بهتر حرکت کنید. این سری کمی با تاخیر همراه بود ولی بالاخره مطلب آماده شد. طبق معمول لازمه یادگیری این جلسه مرور جلسه‌های قبلی هست. دقت کنید که تا حالا انواع داده در زبان C را به همراه مثال هایی معرفی کردیم. حالا نوبت به این رسیده که روی این داده ها بتونیم پردازش هایی را انجام بدیم. پس عملگرهای زبان C راشروع می‌کنیم. 🙂

 

یادآوری

لطفا قبل از مطالعه این بحث، در صورت نیاز مباحث زیر را مطالعه کنید:

انواع داده در زبان C               اشاره گرهای زبان C               آرایه ها در زبان C

رشته ها در زبان C                 آرایه ها و اشاره گرها

عملگرها

عمگر سمبلی است که به کامپایلر می گوید یک عملیات محاسباتی یا منطقی را اجرا کند. به عنوان مثال وقتی عملگر + بین دو مقدار ۱۰ و ۲۴ به شکل ۱۰+۲۴ قرار می گیرد. مفهوم آن عمل جمع زدن این دو مقدار است و نتیجه این عمل ۳۴ می شود. مقادیری که عملگر ها بر روی آنها عمل می کنند را، عملوند می گویند.

در واقع عملگر ها عامل هایی هستند که به وسیله آن ها می توان بر روی اعداد، متغیر ها، آرایه ها و رشته ها و … عملیات حسابی، منطقی، مقایسه، بیتی، بایتی و … انجام داد. عملگر ها در همه ی زبان های برنامه نویسی وجود دارند و جزو بخش های اصلی یک زبان برنامه نویسی هستند. زبان C از نظر ساختار داخلی بسیار قوی بوده و عملگرها قدرتمندی را به طور پیش فرض دارا می باشد. عملگر ها در زبان c به چند دسته تقسیم می شوند:

عملگرهای حسابی

عملگرهای محاسباتی، عملگرهایی هستند که اعمال محاسباتی را روی عملوندها انجام می‌دهند. جدول زیر تمام عملگرهای حسابی را که به وسیله زبان C پشتیبانی می شود نشان می دهد. فرض کنید متغیر A دارای مقدار ۱۰ و متغیر B دارای مقدار ۲۰ است.

عملگر % برای محاسبه باقی‌مانده تقسیم به کار می‌رود. این عملگر عملوند اول را بر عملوند دوم تقسیم می‌کند (تقسیم صحیح) و باقیمانده را برمی‌گرداند.

دو عملگر ++ و — می توانند در طرف چپ یا راست عملوند قرار بگیرند. اگر به‌تنهایی و در یک خط دستور به‌کاربرده شوند، فرقی نمی‌کند اما اگر در یک معادله به‌کاربرده شوند، اینکه طرف راست یا چپ قرار گیرند، متفاوت است. برای درک موضوع به مثال زیر توجه کنید:

  • در خط یک متغیر x از نوع int تعریف و با ۱۰ مقدار دهی اولیه می شود.
  • در خط دو x یک واحد افزایش یافته و برابر با ۱۱ می شود.
  • در خط سه x یک واحد افزایش یافته و برابر با ۱۲ می شود.
  • در خط چهار ابتدا x یک واحد افزایش یافته، برابر با ۱۳ شده و سپس این مقدار به y تخصیص داده می شود. ( ابتدا یک واحد به مقدار متغیر x اضافه‌شده و سپس درون متغیر y قرار می‌گیرد)
  • در خط پنج ابتدا مقدار فعلی x یعنی ۱۳ به y اختصاص داده شده و سپس x یک واحد افزایش یافته برابر با ۱۴ می شود.(ابتدا مقدار متغیر x درون متغیر y قرارگرفته و سپس یک واحد به آن اضافه می‌شود)

به مثالی دیگر دقت کنید:

پس از اجرای دستورالعمل‌های فوق y = 12 خواهد شد. (ابتدا برای خودتان علت را توضیح دهید و سپس در کامپایلری که با آن کار می کنید این موضوع را تست کنید.)

اگر فرصت دارید روی مثال کامل کلیک کرده و آن را بررسی کنید. در غیر این صورت می توانید سراغ عملگرهای بیتی بروید. البته برای فهم بهتر این مثال اگر با مفاهیم تابع و فایل های Header آشنایی کافی ندارید، از پست تابع  و پست دستورات پیش پردازنده مطالب لازم را مطالعه کنید.

مثال کامل

مثال کامل

پس از کامپایل و اجرای برنامه نتایج زیر حاصل می‌شود:

  • در این مثال کتابخانه استاندارد include شده است. (مفهوم include کردن در پست دستورات پیش پردازنده توضیح داده شده است.)
  • در تابع main دو متغیر a و b تعریف و مقدار دهی شده اند. متغیر c هم تعریف شده تا حاصل عملیات a و b در آن ذخیره شود.
  • تابع ()printf برای چاپ اطلاعات در خروجی به کار می‌رود. در پست تابع توضیحات کافی در مورد این تابع داده شده است.
  • در تابع ()printf هرچه بین double quotes است چاپ می شود اما به جای d% مقدار متغیر c (که بعد از کاما قرار گرفته است) قرار می گیرد.
  • آن چه که در line 1 قرار می گیرد حاصل جمع a و b است. بقیه خط ها را سعی کنید خودتان تفسیر کنید.
  • اما همانطور که در خط ۴ می‌بینید، حاصل تقسیم برابر ۲ شده است؛ این در حالی است که تقسیم ۲۱ بر ۱۰ ظاهرا باید اعشاری شود. نکته مهم این‌جاست که اعداد ۲۱ و ۱۰ از نوع صحیح می‌باشند و متغیر نهایی که حاصل باید در آن قرار داده شود(یعنی C ) هم از نوع صحیح است، بنابراین کامپایلر C قسمت اعشار را به طور اتوماتیک حذف کرده است.

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

عملگرهای بیتی روی بیت ها کار می کنند و عملیات را بیت به بیت انجام می دهند. جدول درستی برای & و | و ^ به ترتیب زیر است:

حال که با عملیات بیتی آشنا شدید این عملیات را روی دو عدد ۸ بیتی اجرا می کنیم.فرض کنید که A=60 و B=13 باشد. معادل های باینری آن ها به شکل زیر هستند:

A = 0011 1100

B = 0000 1101

—————–

A&B = 0000 1100

A|B = 0011 1101

A^B = 0011 0001

~A = 1100 0011

جدول زیر عملگرهای بیتی پشتیبانی شده توسط زبان C را نشان می دهد. مقادیر A و B را به ترتیب همان ۶۰ و ۱۳ فرض کنید.

مثال کامل

مثال کامل

به مثال زیر دقت کنید:

پس از کامپایل شدن و اجرای برنامه بالا نتایج زیر بدست می‌آید:
  • در این مثال هم مانند مثال عملگرهای محاسباتی، حاصل عملیات در متغیری ذخیره شده و چاپ می شود. (سعی کنید خودتان کد را دنبال کنید و اگر سوالی داشتید در بخش نظرات بپرسید.)

نکته‌ی مهمی که در مورد عملگر شیفت وجود دارد این است که در شیفت به راست، در هر بار شیفت تمام بیت ها یک خانه(یک بیت) به سمت راست حرکت کرده و یک صفر از بیت پرارزش وارد می‌شود. در شیفت به چپ هم عکس این روال صورت می‌گیرد، یعنی تمام بیت ها یک خانه به چپ شیفت پیدا کرده و یک صفر از بیت کم ارزش وارد می‌شود.

عملگرهای مقایسه‌ای و منطقی

عملگرهای مقایسه‌ای ارتباط بین عملوند ها را مشخص می کنند. جدول زیر عملگرهای مقایسه ای را که توسط زبان C پشتیبانی می شوند، نشان می دهد. A را برابر با ۱۰ و B را برابر با ۲۰ فرض کنید:

 

عملگر های منطقی بر روی عبارات منطقی عمل می کنند. عبارات منطقی دارای دو ارزش درستی و نادرستی اند و زمانی که باید یک شرط بررسی شود، استفاده می شوند. در زبان C ارزش نادرستی با صفر و ارزش درستی با مقادیر غیر صفر مشخص می شود. جدول زیر عملگرهای منطقی که توسط زبان C پشیبانی می شوند را نشان می دهد. A را یک و B را صفر فرض کنید:

نتیجه عملگر && وقتی درست است که هر دو عملوند ارزش درستی داشته باشند و نتیجه عملگر || وقتی نادرست است که هر دو عملوند ارزش نادرستی داشته باشند.

مثال زیر را در نظر بگیرید:

  • در خط چهار  m برابر با ارزش نادرستی خواهد بود؛ زیرا x دارای ارزش نادرستی و y دارای ارزش درستی است.
  • در خط پنج p دارای ارزش درستی خواهد شد؛ زیرا x دارای ارزش نادرستی و y دارای ارزش درستی است و عملگر || روی آنها کار می کند و ارزش درستی را بر میگرداند.
  • در خط شش چون x دارای ارزش نادرستی است، x! دارای ارزش درستی خواهد بود که نتیجه آن در q قرار می گیرد.

برای مطالعه بیشتر می توانید روی مثال زیر کلیک کنید. البته برای افرادی که با ساختارهای شرطی زبان C آشنایی کافی ندارند مطالعه پست ساختارهای شرطی توصیه می شود.

مثال کامل

مثال کامل

 به مثال زیر دقت کنید:

پس از کامپایل و اجرای برنامه بالا نتایج زیر بدست می‌آید:
  • در این مثال دو مقدار با هم مقایسه شده و نتیجه مقایسه چاپ می شود. تفاوت عمده این مثال با مثال های قبلی وجود ساختار شرطی if و else است.
  • در این ساختار اگه شرط if درست باشد دستورات مربوط به if اجرا شده، در غیر این صورت دستورات مربوط به else اجرا می شود.
  • روال بسیار ساده و روان است. خودتان آن را دنبال کرده و در کامپایلر هم تست کنید. البته سعی کنید دستورات را نوشته و کپی نکنید. در نهایت اگر سوالی داشتید حتما در بخش نظرات مطرح کنید.

 

در این مورد به مثالی دیگر توجه کنید:

پس از کامپایل و اجرای برنامه بالا ، نتایج زیر حاصل می شود:

به دلیل تکراری بودن و ارائه توضیحات کافی در جدول ها، مطالعه کدها به خواننده واگذار می شود. سوالات خود را در بخش نظرات مطرح کنید.

عملگرهای انتساب مرکب

این عملگر ها ترکیبی از عملگر مساوی و عملگرهای دیگر هستند. به طور مثال عملگر =+ در نظر بگیرید، اگر به شکل x += a نوشته شود، برابر با x = x+a است؛ یعنی هر بار متغیر x را با متغیر a جمع می کند و درون متغیر x قرار می‌دهد. برای دیگر عملگر های ترکیبی نیز به همین صورت است.

در جدول زیر تمام عملگرهای انتساب مرکب که زبان C آن ها را پشتیبانی می کند نشان داده شده اند:

مانند دیگر عملگرها مثالی کامل در نظر گرفته شده است. می توانید آن را مرور کنید.

مثال کامل

مثال کامل

به مثال زیر دقت کنید:

پس از کامپایل و اجرا شدن برنامه بالا نتایج زیر بدست می‌آید:
به دلیل تکراری بودن و ارائه توضیحات کافی در جدول ها، مطالعه کدها به خواننده واگذار می شود. سوالات خود را در بخش نظرات مطرح کنید.

عملگرهای خاص

عملگر ()

در یک معادله یا یک خط کد، اگر پرانتزهای مختلفی وجود داشته باشند، اولویت همیشه با داخلی‌ترین پرانتز است.

  •  ابتدا ۳+g انجام می‌شود.
  • در مرحله بعد (a/(3+g انجام می‌شود.
  • سپس ((x+(a/(3+g انجام می‌شود.
  • در انتها (x+(a/(3+g)))*2 انجام خواهد شد.

عملگر,

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

در رابطه بالا ابتدا متغیر x برابر با ۲ و بعد در ۷ ضرب می‌شود. سپس در متغیر Y قرار می‌گیرد.

عملگر ?

این عملگر یک انتساب شرطی است و نسبت به صحیح بودن یا نبودن یک شرط، از بین دو مقدار عمل انتساب را انجام می‌دهد.به این عملگر if فشرده هم می گویند.

نحوه تعریف آن بدین شکل است:

حال به مثال زیر توجه کنید:

اگر مقدار متغیر x بزرگ‌تر از ۵ باشد، متغیر x با ۲ جمع می‌شود و اگر مقدار متغیر x کوچک‌تر از ۵ باشد، با ۳ جمع می‌شود و در نهایت به y نسبت داده می شود.

عملگر sizeof

این عملگر طول یک متغیر یا نوع داده را برحسب بایت تعیین می‌کند. نحوه استفاده از این عملگر را در زیر مشاهده می‌کنید (x یک متغیر است).

عملگر &

این عملگر آدرس یک متغیر را بر می گرداند. مثلا a& آدرس متغیر a را می دهد.

عملگر *

عملگر اشاره گره به یک متغیر است. هم در تعریف اشاره گر استفاده می شود و هم در به دست آوردن محتوای آدرسی که به آن اشاره می شود. (می توانید پست اشاره گرها را مطالعه کنید.)

در یک مثال کامل عملگرهای خاص را بررسی میکنیم. برای مطالعه بیشتر کلیک کنید.

مثال کامل

مثال کامل

به مثال زیر دقت کنید:

پس از کامپایل و اجرای برنامه بالا ، نتایج زیر حاصل می‌شود

با توجه به توضیحات بالا سعی کنید درستی نتایج کد را ابتدا به صورت دستی و سپس به وسیله کامپایلر بررسی کنید.

تقدم کلی در عملگرها

تابه‌حال تقدم هر عملگر را در بین هم‌گروه‌های خودش مشاهده کردید ، هر عملگر در بین کلیه عملگرها نیز دارای تقدم است . این تقدم را در جدول زیر می‌بینید:

به مثال زیر دقت کنید:

پس از کامپایل و اجرای برنامه بالا ، نتایج زیر حاصل می‌شود:

این جلسه کمی نفس گیر بود چون خیلی مطلب لازم بود که توضیح بدیم و مسلط بودن به عملگرها خیلی از اشتباهات برنامه نویسی کم می‌کنه. فراموش نکنید که چندین بار مرور کنید و از نمونه برنامه‌ها در کامپایلرهای زبان C تست بگیرید. سوالات و اشکالات خودتون را هم زیر پست بپرسید تا بشون جواب بدیم. تا جلسه بعد که در مورد ساختارهای شرطی میخوایم حرف بزنیم خدانگهدار 😉

درباره ی احسان عبداللهی

احسان عبداللهی هستم | کارشناسی الکترونیک خوندم و کارشناسی ارشد مخابرات |در سال 94 وب سایت میکرولرن را راه اندازی کردم | سعی کردم هر چیزی را به صورت کاربردی دنبال کنم، برای همین از کارشناسی کار با میکروکنترلرهای AVR و ARM، برنامه نویسی C و طراحی PCB را به صورت تخصصی کار کردم و از کارشناسی ارشد برنامه نویسی پایتون ، Computer vision و deep learning را به صورت تخصصی و کاربردی شروع کردم | الان هم سعی میکنم همیشه خودم را به روز نگه دارم و لذت کار کردن با دنیای برنامه نویسی و امبدد سیستم ها را به دیگران انتقال بدم

۸ دیدگاه

  1. دمتون گرم واقعا” عالی بود

  2. ممنون از زحماننون

  3. چه جوری میشه تشخیص داد که ۰۰۱۱۱۱۰۰ میشه ۶۰؟

    • سلام به شما
      این کار خیلی ساده هست. کافیه جایگاه اعداد از سمت راست را به ترتیب از ۰ تا ۷ در نظر بگیری. به این ترتیب اولین یک دارای ارزش ۲ هست.همین روال برای سایر یک ها وصفر ها وجود داره. حالا بیا و عدد هر خونه را(صفر یا یک) در ۲ به توان ارزشش ضرب کن. یعنی اولین یک در ۲ به توان ۲ ضرب میشه و الی آخر. حالا اعداد حاصل را باهم جمع کن. که میشه ۴+۸+۱۶+۳۲ و به ۶۰ میرسیم

  4. عالیترین و کاملترین مقاله با این تاپیک بود که تا حالا دیدم. ممون از زحماتتون

  5. مهندس عزیز خسته نباشى خیلى ممنون عالى عالى پرچم بالاى بالاست

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *