خبر و ترفند روز

خبر و ترفند های روز را اینجا بخوانید!

در مقایسه اعداد در C++ دقت کنید

اگر از پس زمینه ریاضی به برنامه نویسی می پردازید، این جزئیات ظریف به راحتی می تواند شما را جلب کند.

C++ یک زبان برنامه نویسی پرکاربرد است، اما همچنین یکی از زبان های برنامه نویسی است که در آن خطاهای برنامه نویسی رایج ترین هستند. بسیاری از این خطاها ناشی از خطاهای منطقی است. به طور خاص، خطاهای ایجاد شده در طول عملیات مقایسه می تواند بر دقت و قابلیت اطمینان کد شما تأثیر بگذارد.

زبان C++ دارای یک خطای مقایسه خاص است که بسیاری از توسعه دهندگان جدید نادیده گرفته می شوند. این خطا ناشی از درک نادرست از نحوه عملکرد عملگرها هنگام انجام مقایسه های چندگانه است. دریابید که چگونه از این اشتباه رایج اجتناب کنید و چرا در وهله اول رخ می دهد.

مقایسه در C++

زبان برنامه نویسی C++ بسیاری از ویژگی ها و ابزارهای مختلف را همراه با عملیات اساسی مانند عملگرهای مقایسه ارائه می دهد. عملگرهای مقایسه، عملیات ویژه ای در زبان های برنامه نویسی هستند که می توانید از آنها برای مقایسه داده ها با یکدیگر استفاده کنید. توسعه دهندگان اغلب از این عملگرها استفاده می کنند، به خصوص هنگام ایجاد الگوریتم.

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

اغلب می توانید عملگرهای مقایسه را در دستورات if-else مشاهده کنید. عملگرهای مقایسه مکانی هستند که باید بررسی کنیم که آیا یک مقدار بزرگتر، کمتر یا مساوی با مقدار دیگری است یا خیر. یک جزئیات بسیار کوچک اما مهم وجود دارد که نباید از آن غافل شوید. نتایج عبارات مقایسه درست یا نادرست را برمی‌گرداند که مقادیر بولی هستند. این مقادیر یکی از اجزای اساسی ساختار کنترل در برنامه نویسی هستند.

مطلب مرتبط:   با GitHub Actions یک React Application را در Firebase اجرا کنید

به عنوان مثال، در زبان برنامه نویسی C++، عملگر “==” بررسی می کند که آیا دو مقدار برابر هستند یا خیر. اگر مقادیر برابر باشند، نتیجه true را برمی گرداند. در غیر این صورت نتیجه نادرست خواهد بود.

if (a == b)
{
    return true;
}
else
{
    return false;
}

مثالی از مسئله مقایسه

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

به عنوان مثال، اگرچه عبارت 3 < 15 < 10 از نظر ریاضی نادرست است، C++ نتیجه آن را درست می داند. شما می توانید این را با نوشتن برنامه آزمایشی ساده زیر نشان دهید.

ابتدا یک فایل با نام test.cpp ایجاد کنید. این فایل را با استفاده از ویرایشگر کد مورد علاقه خود باز کنید و کد زیر را به آن اضافه کنید.

#include <iostream>
int a = 15;

int main()
{
    if (3 < a < 10)
    {
        std::cout << "foo" << std::endl;
    }
    else
    {
        std::cout << "boo" << std::endl;
    }

    return 0;
}

می توانید از این دستور برای کامپایل و اجرای کد استفاده کنید:

g++ test.cpp -o Test

اکنون برنامه ای به نام Test دارید. برنامه را اجرا کنید و خروجی آن را بررسی کنید.

اسکرین شات خروجی foo برای کد نمونه را نشان می دهد

C++ هنگام اجرای این برنامه 3 < 15 < 10 را درست در نظر گرفت. چرا ممکن است نتیجه به این شکل باشد، حتی اگر از نظر ریاضی یک جمله نادرست است؟

مطلب مرتبط:   نحوه ایجاد لوله های سفارشی در Angular

علل مشکل مقایسه در C++

مانند بسیاری از زبان های برنامه نویسی، C++ کد را از چپ به راست می خواند. هر عملگر مقایسه یک مقدار بولی تولید می کند. مقادیر بولی فقط به معنای درست و نادرست نیست. آنها یک معادل ریاضی دارند.

اصل کار یک کامپیوتر به یک و صفر بستگی دارد. برای یک کامپیوتر، نتیجه چیزی یا درست است یا نادرست. برنامه های کامپیوتری معمولا عدد 1 را درست و عدد 0 را نادرست می دانند.

دوباره مشکل مقایسه را بررسی کنید و عبارت را از چپ به راست بخوانید. خواهید دید که دو مقایسه متفاوت وجود دارد. اولین مقایسه بین اعداد 3 و 15 است. این یک مقدار واقعی است زیرا 3 کمتر از 15 است.

مقایسه دوم بین آن نتیجه و عدد 10 است. از آنجایی که باید یک مقایسه عددی انجام دهد، C++ بی‌صدا مقدار واقعی بولی را به 1 تبدیل می‌کند. 1 کمتر از 10 است، بنابراین نتیجه کلی درست است.

نموداری که خواندن عملیات مقایسه را از چپ به راست توصیف می کند

در نتیجه، اگرچه به نظر یک اشتباه ریاضی است، این جمله برای C++ و کامپیوترها صادق است.

نحوه حل مسائل مقایسه در C++

C++، همراه با اکثر زبان های برنامه نویسی دیگر، از نحو متفاوتی برای مقایسه منطقی نسبت به ریاضیات سنتی استفاده می کند. عبارت ریاضی 3 < a < 15 به معنای "3 کمتر از a و a کمتر از 15 است." با این حال، همانطور که مشاهده کردید، C++ آن عبارت را متفاوت تفسیر می کند.

برای نمایش و در C++، از عملگر && استفاده کنید. سپس می توانید عبارات بولی را با هم زنجیره بزنید و با استفاده از عملگرهایی مانند && برای نشان دادن AND، || منطق بسازید. برای نشان دادن OR، و ! برای نمایندگی NOT. زبان هایی مانند جاوا از همان عملگرهای منطقی استفاده می کنند.

مطلب مرتبط:   افزایش عملکرد با حافظه پنهان در Nest.js

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

#include <iostream>
int a = 15;

int main()
{
    if (3 < a && a < 10)
    {
        std::cout << "foo" << std::endl;
    }
    else
    {
        std::cout << "boo" << std::endl;
    }

    return 0;
}

حالا این کد تست می کند که آیا مقدار a بزرگتر از 3 است و آیا مقدار a کمتر از 10 است یا خیر. برنامه را کامپایل و اجرا کنید و نتیجه را مشاهده کنید.

کامپایل و اجرای برنامه با استفاده از عملگر و

مثال قبلی “foo” را چاپ می کرد، اما برنامه اکنون “boo” را همانطور که در نظر گرفته شده است چاپ می کند. مقدار بولی سمت چپ مقایسه (3 < a) درست است. مقدار سمت راست (a < 10) نادرست است. از آنجایی که true و false همیشه نادرست است، عبارت کلی به false ارزیابی می شود، به طوری که شرط از کار می افتد و بلوک else اجرا می شود.

عملگر AND (&&) را به OR (||) تغییر دهید و نتیجه متفاوت را مشاهده کنید.

اهمیت بررسی های منطقی در C++

مقایسه های منطقی در C++ شامل استفاده از مقادیر بولی و عملگرهای مقایسه است. مطمئن شوید که از مقادیر بولی درست و عملگرهای مقایسه برای کنترل عملکرد برنامه های خود استفاده می کنید. تشخیص عبارات بد شکل می‌تواند دشوار باشد زیرا C++ اغلب رفتارهای متفاوتی را انجام می‌دهد تا اینکه به طور کامل شکست بخورد.

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