خوش آموز درخت تو گر بار دانش بگیرد، به زیر آوری چرخ نیلوفری را


آموزش زبان ++C : مقادیر بولی و مقدمه ای بر بیانیه if

آموزش زبان ++C : مقادیر بولی و مقدمه ای بر بیانیه if
نویسنده : امیر انصاری
در زندگی واقعی، خیلی رایج است که سوالاتی بپرسید که پاسخ آنها "بله" یا "خیر" باشد. آیا سیب یک میوه است؟ "بله". آیا مارچوبه دوست دارید؟ "خیر".

نرم افزار سامانه مودیان راهکار



حالا این بیانیه را در نظر بگیرید : "سیب ها میوه هستند". آیا این بیانیه صحیح است یا غلط است؟ کاملاً واضح است که صحیح می باشد. در مورد بیانیه "من مارچوبه دوست دارم" چطور؟ قطعاً خیر (اوه!).

این نوع از جملات که تنها دو نتیجه ممکن دارند: بله/صحیح، یا خیر/غلط، خیلی شایع هستند، برای همین بسیاری از زبانهای برنامه نویسی یک نوع خاص برای برخورد با آنها پیش بینی کرده اند. این نوع خاص نوع داده بولی (boolean) نامیده می شود.

متغیرهای بولی (Boolean variables)


متغیرهای بولی (Boolean variables)، متغیرهایی هستند که تنها دو مقدار ممکن را دارند : true یا صحیح و false یا غلط. که مقدار true برابر با 1 و مقدار false برابر با 0 می باشد.

برای معرفی کردن متغیرهای بولی (Boolean variables) از کلمه کلیدی bool استفاده می کنیم.

bool b;

برای اینکه به متغیرهای بولی (Boolean variables) مقدار اولیه بدهیم، از کلمه کلیدی true و false استفاده می کنیم.

bool b1 = true; // copy initialization
bool b2(false); // direct initialization
bool b3 { true }; // uniform initialization (C++11)
b3 = false; // assignment

درست همانطور که عملگر یگانی منفی (-) می تواند برای تبدیل یک متغیر integer از مثبت به منفی به کار رود، عملگر منطقی NOT (!) نیز می تواند برای تبدیل کردن true به false و یا برعکس آن بکار رود.

bool b1 = !true; // b1 will have the value false
bool b2(!false); // b2 will have the value true

مقادیر متغیرهای بولی (Boolean variables) در واقع به صورت کلمات true یا false در متغیر ذخیره نمی شوند. بلکه آنها به صورت integer ذخیره می شوند : مقدار true به مقدار 1 تبدیل می شود و مقدار false نیز به مقدار 0 تبدیل می گردد. همچنین هنگامی که آنها را با هم مقایسه می کنیم در واقع این مقادیر 0 و 1 هستند که با یکدیگر مقایسه می گردند و نه true و false .

در نتیجه، هنگامی که مقادیر بولی را با تابع std::cout چاپ می کنیم، مقادیر 0 یا 1 چاپ خواهند شد :

#include "iostream"

int main()
{
std::cout << true << std::endl; // true evaluates to 1
std::cout << !true << std::endl; // !true evaluates to 0

bool b(false);
std::cout << b << std::endl; // b is false, which evaluates to 0
std::cout << !b << std::endl; // !b is true, which evaluates to 1
return 0;
}

خروجی :

1
0
0
1

اگر تمایل دارید تا تابع std::cout مقادیر true و یا false را به جای مقادیر 0 یا 1 چاپ کند، می توانید از تابع std::boolalpha استفاده کنید :

#include "iostream"

int main()
{
std::cout << true << std::endl;
std::cout << false << std::endl;

std::cout << std::boolalpha; // print bools as true or false

std::cout << true << std::endl;
std::cout << false << std::endl;
return 0;
}

خروجی این برنامه :

1
0
true
false

همچنین توسط تابع std::noboolalpha می توانید وضعیت نمایش true یا false را مجددا به صورت 1 و 0 در بیاورید.

نگاهی به مقادیر بولی در بیانیه if


یکی از کاربردهای رایج متغیرهای بولی (Boolean variables) استفاده از آنها در داخل بیانیه های if می باشد. بیانیه های if معمولاً شکل زیر را دارند :

if (expression) statement1;

یا

if (expression) statement1;
else statement2;

هنگامیکه که عبارت (expression) در داخل یک بیانیه if استفاده می شود، به آن شرط یا عبارت شرطی نیز گفته می شود.

در هر دو شکل بیانیه if ، عبارت (expression) ارزیابی می گردد. اگر عبارت (expression) به یک مقدار غیر از صفر ارزیابی گردد، بیانیه statement1 اجرا می شود. در شکل دوم بیانیه if، اگر عبارت (expression) به صفر ارزیابی گردد، بیانیه statement2 به جایش اجرا می شود.

به یاد داشته باشید که true به 1 ارزیابی می شود (که یک مقدار غیر صفر می باشد) و false به 0 ارزیابی می شود.

در اینجا یک مثال ساده آورده ایم :

if (true) // true is our conditional expression
std::cout << "The condition is true" << std::endl;
else
std::cout << "The condition is false" << std::endl;

خروجی :

The condition is true

بیایید بررسی کنیم چگونه این اتفاق می افتد. ابتدا ما قسمت شرط بیانیه if را ارزیابی می کنیم. عبارت true به 1 ارزیابی می شود که یک مقدار غیر صفر می باشد، بنابراین بیانیه های داخل بدنه بیانیه if اجرا خواهند شد.

برنامه زیر نیز به طور مشابهی کار خواهد کرد :

bool b(false);
if (b)
std::cout << "b is true" << std::endl;
else
std::cout << "b is false" << std::endl;

خروجی :

b is false

در برنامه بالا، هنگامی که شرط ارزیابی می گردد، متغیر b به مقدار آن که false می باشد ارزیابی می گردد. مقدار false نیز به 0 ارزیابی می شود. در نتیجه، قسمت بدنه بیانیه if اجرا نخواهد شد، اما قسمت else اجرا می گردد.

یک مثال کمی پیچیده تر


عملگر برابری (==) که به انگلیسی به آن equality operator گفته می شود، برای مقایسه برابری دو مقدار integer به کار می رود. اگر عملوند ها (operands) با هم برابر باشند، عملگر برابری (==) مقدار true را برمیگرداند و در غیر اینصورت مقدار false را برمیگرداند.

#include "iostream"

int main()
{
std::cout << "Enter an integer: ";
int x;
std::cin >> x;

if (x == 0)
std::cout << "The value is zero" << std::endl;
else
std::cout << "The value is non-zero" << std::endl;
return 0;
}

خروجی این برنامه در یکبار اجرای آن به شکل زیر می باشد :

Enter an integer: 4
The value is non-zero

بیایید بررسی کنیم که چگونه این کد کار می کند. ابتدا، کاربر یک مقدار integer را وارد می کند. سپس ما با استفاده از عملگر برابری (==) تست می کنیم که آیا مقدار وارد شده توسط کاربر با 0 برابر می باشد یا خیر. در این مثال، از آنجا که کاربر عدد 4 را وارد کرده است، و 4 برابر با 0 نمی باشد، عملگر برابری (==) به false ارزیابی می شود. این باعث می شود تا قسمت else از بیانیه if اجرا گردد، و خروجی “The value is non-zero” را تولید کند.

مقادیر بازگشتی بولی (Boolean return values)


مقادیر بولی (Boolean values) معمولاً در توابع به عنوان مقدار بازگشتی (return value) مورد استفاده قرار می گیرند تا بررسی کنند که آیا چیزی true (صحیح) می باشد یا خیر. اینگونه توابع معمولاً با کلمه is و یا کلمه has آغاز می شوند (مثلاً isEqual و یا hasCommonDivisor).

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

#include "iostream"

// returns true if x and y are equal, false otherwise
bool isEqual(int x, int y)
{
return (x == y); // operator== returns true if x equals y, and false otherwise
}

int main()
{
std::cout << "Enter an integer: ";
int x;
std::cin >> x;

std::cout << "Enter another integer: ";
int y;
std::cin >> y;

if (isEqual(x, y))
std::cout << x << " and " << y << " are equal" << std::endl;
else
std::cout << x << " and " << y << " are not equal" << std::endl;

return 0;
}

خروجی این برنامه در یکبار اجرای آن به شکل زیر می باشد :

Enter an integer: 5
Enter another integer: 5
5 and 5 are equal

بیایید چگونگی اجرای این برنامه را بررسی کنیم؟ ابتدا مقادیر متغیرهای از نوع integer را که متغیرهای x و y می باشند از کاربر دریافت می کنیم. سپس عبارت شرطی

isEqual(x, y)

ارزیابی می شود. در واقع تابع مربوطه به صورت

isEqual(5, 5)

فراخوانی می شود. در داخل تابع مربوطه 5 == 5 ارزیابی می گردد گه مقدار true را تولید خواهد کرد، چرا که 5 با 5 برابر می باشد. مقدار true به تابع فراخوانی کننده (caller) باز می گردد. از آنجا که شرط به true ارزیابی می شود، بیانیه های موجود در قسمت if اجرا می شوند و خروجی

“5 and 5 are equal”

تولید می گردد.

شرط های غیر بولی (Non-boolean conditionals)


در تمامی مثال های بالا، شرط های ما مقادیر بولی (true یا false) بودند، متغیرهای بولی یا توابعی که مقدار بازگشتی آنها بولی بود. اگر عبارت شرطی شما به یک مقدار بولی ارزیابی نشود، چه اتفاقی می فتد؟

شما از قبل جواب را می دانید : اگر شرط شما به یک مقدار غیر صفر (non-zero value) ارزیابی شود، سپس بیانیه های متصل به قسمت if اجرا خواهند شد.

بنابراین، اگر کاری مشابه کار زیر انجام بدهیم :

if (4) // non-nonsensical, but for the sake of example...
std::cout << "hi";
else
std::cout << "bye";

این برنامه متن “hi” را چاپ خواهد کرد، چرا که 4 یک مقدار غیر صفر می باشد.

گرفتن مقادیر بولی از کاربر


گرفتن مقادیر متغیرهای بولی از کاربر، با استفاده از تابع std::cin بعضی وقتها برنامه نویسان تازه کار را به اشتباه می اندازد.

برنامه زیر را در نظر بگیرید :

int main()
{
bool b; // uninitialized variable
std::cout << "Enter a boolean value: ";
std::cin >> b;
std::cout << "You entered: " << b;

return 0;
}

خروجی این برنامه :

Enter a boolean value: true
You entered: 119

صبر کنید، چی شد؟

به نظر می رسد که تابع std::cin در مورد مقادیر بولی تنها دو مقدار 0 و 1 را قبول می کند ( ونه true یا false را). وارد کردن هر مقدار دیگری غیر از 0 یا 1 تابع std::cin را به اشتباه می اندازد. در این مثال، از آنجا که تابع std::cin نمی توانست مقدار true را به متغیر بولی b نسبت بدهد. این متغیر بدون مقدار اولیه باقی می ماند و آنچیزی را هم که چاپ می کند، در واقع یک مقدار زباله است که از برنامه های قبلی در حافظه مانده است!


آموزش قبلی : آموزش زبان ++C : اعداد ممیز شناور (اعداد اعشاری)

آموزش بعدی : آموزش زبان ++C : نوع داده Char



نمایش دیدگاه ها (0 دیدگاه)

دیدگاه خود را ثبت کنید:

انتخاب تصویر ویرایش حذف
توجه! حداکثر حجم مجاز برای تصویر 500 کیلوبایت می باشد.