عنوان:

‫سرریز اعداد و checked در #C


نویسنده: رحمت اله رضایی
تاریخ: ۱۳۹۱/۰۸/۲۴ ۸:۵
آدرس: www.dntips.ir
حلقه زیر را در نظر بگیرید :
                for (byte i = 0; i <= 255; i++)
                {
                    ...
                }
به نظر شما این حلقه چند بار اجرا می‌شود؟

این حلقه را در یک برنامه استفاده کرده بودم. مشکل اینجا بود که برنامه وارد حلقه می‌شد اما از آن خارج نمی‌شد و یک حلقه بی‌نهایت ایجاد شده بود.
اما چرا؟

دلیل آن این است که وقتی i به 255 رسیده و می‌خواهد به اضافه یک شود، حاصل 256 نمی‌شود که شرط i<=255 برقرار نشود و برنامه از حلقه خارج شود. بلکه چون i از نوع byte است، سرریز کرده و نتیجه صفر می‌شود.
این حالت برای int و سایر نوع اعداد هم صادق است.
برای رفع این مشکل چکار باید کرد؟

چاره آن کلمه کلیدی checked است که از سرریز اعداد جلوگیری می‌کند :
            checked
            {
                for (byte i = 0; i <= 255; i++)
                {
                    ...
                }
            }
در این حالت زمانی که i به 255 رسیده و می‌خواهد به اضافه یک شود، OverflowException ایجاد می‌شود.

در مقابل کلمه 
unchecked هم هست که عکس checked عمل می‌کند.

نظرات

  • وحید نصیری در ۱۳۹۱/۰۸/۲۴ ۹:۳۹
    روش دیگر کامپایل کردن کد با پارامتر زیر است
    /checked
    در کل کارآیی این روش حدود سه بار کندتر است از روش معمولی بدون checked و اگر مشکل یافت شده بهتر است از بازه صحیح اعداد استفاده شود.

    • رحمت اله رضایی در ۱۳۹۱/۰۸/۲۴ ۱۴:۱۳
      ممنون. اصلاح کردم به :
                  for (int i = 0; i <= 255; i++)
                  {
                      ...
                  }