زنگ سی شارپ – قسمت هشتم

آشنایی با عمل‌گرهای افزایشی و کاهشی


مسعود درویشیان ۱۱ دیدگاه سی شارپ دوشنبه, ۱۰ام مهر , ۱۳۹۱ 17736 بازدید

در قسمت قبل با if های تو در تو و if-else-if ladder آشنا شدیم. قصد داریم با دستور switch و حلقه‌ی for آشنا شویم که یکی دیگر از مباحث بسیار مهم و پایه‌ای در برنامه‌نویسی هستند ولی قبل از این‌که سراغ حلقه‌ها برویم لازم است با یک‌سری از عمل‌گرهای ریاضی آشنا شویم.

زنگ سی‌شارپ - قسمت هشتم

عمل‌گرهای افزایشی و کاهشی (Increment و Decrement)

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

counter = counter + 1;

این عبارت از نظر یک دانشجوی ریاضی، یک عبارت نادرست است اما همان‌طور که در قسمت سوم بیان شد در سی‌شارپ علامت تک‌مساوی (=) برای مقایسه دو مقدار استفاده نمی‌شود و در واقع، علامت تک‌مساوی، علامت انتساب است. خط کد بالا این‌طور عمل می‌کند که یک کپی از مقدار سمت راست مساوی را در قسمت سمت چپ قرار می‌دهد. فرض کنید مقدار counter عدد ۲ باشد، در این خط کد ۱ + ۲ می‌شود و حاصل آن در سمت چپ مساوی قرار می‌گیرد که در سمت چپ، خود متغیر counter قرار دارد و این بدین معنی است که: مقدار counter با عدد ۱ جمع شده و مجدداً در خودش ریخته می‌شود و در نهایت مقدار counter برابر با ۳ است.

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

counter += 1;
counter = counter + 1;

عمل‌گر =+ به‌طور هم‌زمان عملیات “اضافه‌کردن و اختصاص‌دادن” را انجام می‌دهد. این عمل‌گر، عمل‌وند سمت راست را با عمل‌وند سمت چپ جمع می‌کند و نتیجه‌ی آن را به عمل‌وند سمت چپ اختصاص می‌دهد. علاوه‌بر عمل‌گر =+ عمل‌گرهای =- و =* و =/ نیز وجود دارند که برای منظورهای دیگری استفاده می‌شوند.

  • عمل‌گر =- از لحاظ طریقه‌ی عمل‌کرد مشابه =+ است با این تفاوت که به‌جای جمع، عمل تفریق را انجام می‌دهد. برای مثال در دستور counter -= 1 مقدار عمل‌وند سمت راست از مقدار عمل‌وند سمت چپ کم می‌شود و حاصل آن در عمل‌وند سمت چپ ذخیره می‌شود.
  • عمل‌گر =* به طریقی مشابه عمل “ضرب‌کردن و اختصاص‌دادن” را انجام می‌دهد.
  • عمل‌گر =/ نیز به همین روال عمل می‌کند. برای مثال counter /= 2 معادل با counter = counter / 2 است.

به‌خاطر داشته باشید که نباید بین دو علامت این عملگرها فاصله بگذارید. فاصله گذاشتن قبل و بعد از آن‌ها اختیاری است.

هنگامی که می‌خواهید دقیقاً ۱ واحد به متغیر خود اضافه کنید می‌توانید از دو عمل‌گر پیش‌وندی و پس‌وندی برای افزایش مقدار متغیر استفاده کنید. برای استفاده از عمل‌گر افزایشی پیش‌وندی (prefix increment operator) کافی است از دو علامت + قبل از اسم متغیر استفاده کنید. به‌عنوان مثال، در نمونه‌ی زیر متغیر someValue در نهایت مقدار ۷ را در خود نگه می‌دارد:

using System;
class Example
{
    static void Main()
    {
        int someValue = 6;
        ++someValue;

        Console.WriteLine(someValue);
    }
}

متغیر someValue در ابتدا مقدار ۶ را در خود نگه می‌دارد ولی پس از این‌که عمل‌گر ++ روی آن اعمال شد، مقدار متغیر ۱ واحد افزایش پیدا می‌کند. برای استفاده از ++ پس‌وندی، از دو علامت پلاس (+) بعد از اسم متغیر استفاده می‌کنیم. به نمونه‌ی زیر دقت کنید:

using System;
class Example
{
    static void Main()
    {
        int anotherValue = 56;
        anotherValue++;

        Console.WriteLine(anotherValue);
    }
}

در این مثال مقدار متغیر anotherValue برابر با ۵۶ است و پس از اعمال عمل‌گر ++ پس‌وندی، مقدار آن برابر با ۵۷ می‌شود. ++ پیش‌وندی و پس‌وندی را می‌توانید به‌روی متغیرها اعمال کنید و اعمال آن‌ها به‌روی اعداد ثابت نادرست است. برای مثال، ۵۶++ نادرست است زیرا عدد ۵۶ ثابت است و تغییر نمی‌کند ولی اگر عدد ۵۶ را در یک متغیر قرار دهید می‌توانید از این عمل‌گر برای افزایش مقدار آن استفاده کنید. برای نمونه، int val = 56 و سپس می‌توانید بنویسید val++ یا ++val و مقدار متغیر را افزایش دهید.

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

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

using System;
class Example
{
    static void Main()
    {
        int b, c;

        b = 4;
        c = ++b;
        Console.WriteLine("{0} {1}", b, c);
    }
}

هنگامی‌که برنامه‌ی بالا را اجرا می‌کنید می‌بینید که در خروجی “۵ ۵” چاپ می‌شود. در این مثال، ابتدا مقدار ۴ به b اختصاص داده می‌شود سپس مقدار b یک واحد اضافه شده و برابر با مقدار ۵ می‌شود و در نهایت مقدار b به c اختصاص داده می‌شود. روند این پروسه به‌این دلیل بود که از ++ پیش‌وندی استفاده کردیم. در مقابل، وقتی‌که از ++ پس‌وندی استفاده می‌کنید ابتدا متغیر مورد استفاده قرار می‌گیرد سپس نتایج محاسبه شده و ذخیره می‌گردد. برای مثال در نمونه‌ی زیر، ابتدا b شامل مقدار ۴ است سپس در خط بعد مقدار b به c اختصاص داده می‌شود و پس‌از این‌که مقدار b به c اختصاص داده شد، مقدار b یک واحد افزایش پیدا می‌کند و برابر با ۵ می‌شود:

b = 4;
c = b++;
Console.WriteLine("{0} {1}", b, c);

خروجی این برنامه برابر با “۴ ۵” است. به‌عبارت دیگر، اگر b = 4 باشد آن‌گاه مقدار ++b هم‌چنان برابر با ۴ است و هنگامی‌که مقدار b به c اختصاص داده شد سپس مقدار b یک واحد افزایش پیدا می‌کند.

علاوه‌بر عمل‌گر پیش‌وندی و پس‌وندی افزایشی، می‌توانید از عمل‌گر پیش‌وندی و پس‌وندی کاهشی (-‌-) نیز استفاده کنید. عمل‌گر ماینس ماینس (-‌-) دقیقاً یک واحد را از متغیر کم می‌کند (Minus) و طریقه‌ی عمل‌کرد آن به‌صورت پیش‌وندی و پس‌وندی، به‌شکلی مشابه با پلاس پلاس (++) است با این تفاوت که به‌جای عمل افزایش، عمل کاهش را انجام می‌دهد.



نویسنده / مترجم : مسعود درویشیان

علاقه مند به موسیقی و برنامه نویسی بازی


۱۱ دیدگاه برای این نوشته ثبت شده است


  1. علیرضا
    ۱۱ مهر ۱۳۹۱

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

    using System;
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main()
            {
                // Icrement Operator
                int x, y;
                x = 1;
                y = 0;
                for (int i = 0; i < 10; i++)
                {
                    y = y + x++; // Postfix
                    Console.WriteLine(y);
                }
                Console.WriteLine();
                // در اینجا مقدارهای این دو متغییر را به همان مقدار صفر و یک برمیگردانیم
                x = 1;
                y = 0;
                for (int i = 0; i < 10; i++)
                {
                    y = y + ++x; // prefix
                    Console.WriteLine(y);
                }
                Console.ReadLine();
            }
        }
    
    }
    



    • مسعود درویشیان
      ۱۱ مهر ۱۳۹۱

      مرسی از مثال خیلی خوب و واضح‌تون




    • رضا
      ۱۶ آذر ۱۳۹۲

      سلام
      دوست عزیز منم تشکر میکنم از مثال زیباتون که به شخصه به من کمک کرد ولی خواستم یادآوری کنم که در این سطح آموزش هنوز حلقه ها آموزش داده نشده.
      بنابراین اگه لطف کنید مثال دیگه ای بگذارید به افرادی که از صفر با کمک این مقالات بالا میان کمک بیشتری کردید
      ممنون




    • hossein
      ۳۰ دی ۱۳۹۵

      ممنون خیلی مثال ساده و خوبی بود فقط باید مرحله به مرحله برنامه رو اجرا کنیم که فرق پیشوندی و پسوندی رو درک کنیم




  2. Praise
    ۲۱ آذر ۱۳۹۱

    ممنون استفاده کردیم !




  3. کمیل
    ۲۸ خرداد ۱۳۹۲

    سلام”
    یه مدتی بود که تصمیم داشتم که برنامه نویسی با C# رو شروع کنم ولی نمیدونستم که از چه کتابی استفاده کنم تا بدون حاشیه و مختصر و مفید توضیح داده باشه،تا زمانی که از طریق یکی از دوستام با سایت شما آشنا شدم.
    فکر میکنم بهتر از این نمیشد که این برنامه رو از صفر شروع کرد.
    واقعا ازتون ممنونم.




  4. shahrokhdj
    ۲۴ مهر ۱۳۹۲

    سلام
    بابت اموزش هاتون ممنون

    یه کوچولو در مورد این روش {۰} و {۱} توضیح میدین!!!!۱

    :X




    • llıı♣Amir♣ııll
      ۵ آبان ۱۳۹۲

      سلام به همه دوستان و خسته نباشید به مدیر محترم جناب درویشیان…
      منم یه کاربر تازه هستم و خواستم در جواب شاهرخ خان بگم که منظور از اون ۰ و۱ یعنی اینکه در خروجی کدوم متغییر اول نمایش داده بشه که در مقالات قبلی هم اشاره شده…




  5. سعید
    ۱۱ خرداد ۱۳۹۳

    آقا مسعود خیلی خوب بود




  6. فاطمه
    ۲۰ مهر ۱۳۹۳

    با سلام و خسته نباشید
    اقای درویشیان با عرض پوزش یک سوال دارم شما فرمودید که در عبارت پسوندی ابتدا متغیر مورد استفاده قرار می‌گیرد سپس نتایج محاسبه شده و ذخیره می‌گردد. پس چرا خروجی اول شده ۴ و خروجی دوم شده ۵ مگه نباید برعکس بشه؟برای من سردرگمی ایحاد شده




  7. جواد بابایی
    ۱۷ مهر ۱۳۹۴

    میشه جلسات رو یه جایی مرتب برای دانلود بذارید من جلسه ۱۶ رو می خوام پیداش نمی کنم



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





نشانی ایمیل شما منتشر نخواهد شد.

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

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

شما میتوانید با مراجعه به سایت گراواتار یک آواتار اختصاصی برای خود تعریف کنید، تا در کنار نام شما نمایش داده شود

برای قرار دادن کدهای نمونه می توانید از تگ های [php] ، [html] ، [css] و [js] استفاده کنید.
به عنوان مثال کدهای php را می توان به صورت زیر قرار داد:
[php] var $whoLoveIranians = "WebTarget!"; [/php]



کلیه حقوق مادی و معنوی برای وب سایت وب تارگت محفوظ است ©2017 وب‌تارگت

استفاده از مطالب وب سایت در سایر وب سایت‌ها و نشریات چاپی با ذکر منبع آزاد است.