Ако започвате да програмирате от математически опит, този фин детайл може лесно да ви хване.

C++ е широко използван език за програмиране, но също и такъв, в който програмните грешки са най-чести. Много от тези грешки се дължат на логически грешки. По-специално грешките, направени по време на операции за сравнение, могат да повлияят на точността и надеждността на вашия код.

Езикът C++ има една конкретна грешка при сравнение, която много нови разработчици пренебрегват. Тази грешка е резултат от неправилно разбиране на това как работят операторите при извършване на множество сравнения. Разберете как да избегнете тази често срещана грешка и защо изобщо се случва.

Сравнения в C++

Езикът за програмиране C++ предлага много различни функции и инструменти, заедно с основни операции като оператори за сравнение. Операторите за сравнение са специални операции в езиците за програмиране, които можете да използвате, за да сравнявате данни помежду си. Разработчиците използват тези оператори доста често, особено когато създават алгоритми.

instagram viewer

Можете да видите оператори за сравнение в много различни примери в ежедневието. Например, когато пазарувате в магазина за хранителни стоки, вие използвате предвид тези оператори, за да сравнявате цените. Ако цената на един продукт е по-ниска от другата, вие избирате този продукт.

Можете да видите операторите за сравнение в оператори if-else доста често. Операторите за сравнение са мястото, където можете да проверите дали една стойност е по-голяма, по-малка или равна на друга стойност. Има един много малък, но важен детайл, който не трябва да пренебрегвате. Резултатите от изразите за сравнение връщат true или false, които са булеви стойности. Тези стойности са един от основните компоненти на управляващата структура в програмирането.

Например в езика за програмиране C++, "==" операторът проверява дали две стойности са равни. Ако стойностите са равни, резултатът връща true. В противен случай резултатът ще бъде фалшив.

ако (a == b)
{
връщаневярно;
}
друго
{
връщаненевярно;
}

Пример за задача за сравнение

Една от често срещаните грешки на начинаещите в C++ е използването на оператори за сравнение. Тези оператори позволяват на програмистите да сравняват две стойности и да извършват различни операции въз основа на резултата от това сравнение. Въпреки това, използването на тези оператори неправилно може да причини неочаквани грешки.

Например, въпреки че изразът 3 < 15 < 10 е математически неправилен, C++ счита резултата му за верен. Можете да демонстрирате това, като напишете следната проста тестова програма.

Първо създайте файл с име test.cpp. Отворете този файл с вашия любим редактор на кодове и добавете следния код към него.

#включват
вътр а = 15;

вътросновен()
{
ако (3 < a < 10)
{
std::cout << "фу" << std::endl;
}
друго
{
std::cout << "бу" << std::endl;
}

връщане0;
}

Можете да използвате тази команда, за да компилирате и стартирате кода:

g++ test.cpp -o Тест

Вече имате програма, наречена Тест. Стартирайте програмата и разгледайте нейния изход.

C++ счита 3 < 15 < 10 за вярно, когато изпълнява тази програма. Защо резултатът може да излезе по този начин, въпреки че е математически неправилно твърдение?

Причини за проблема със сравнението в C++

Както повечето езици за програмиране, C++ чете кода отляво надясно. Всеки оператор за сравнение произвежда булева стойност. Булевите стойности не означават само true и false; те имат математически еквивалент.

Принципът на работа на a компютърът зависи от единици и нули. За компютъра резултатът от нещо е или верен, или неверен. Компютърните програми обикновено третират числото 1 като вярно, а числото 0 като невярно.

Разгледайте проблема със сравнението отново и прочетете твърдението отляво надясно; ще видите, че има две различни сравнения. Първото сравнение е между числата 3 и 15. Това е истинска стойност, защото 3 е по-малко от 15.

Второто сравнение е между този резултат и числото 10. Тъй като трябва да извърши числово сравнение, C++ безшумно преобразува истинската булева стойност в 1. 1 е по-малко от 10, така че общият резултат е верен.

В заключение, въпреки че изглежда като математическа грешка, това твърдение е вярно за C++ и компютрите.

Как да решаваме проблеми със сравнение в C++

C++, заедно с повечето други езици за програмиране, използва различен синтаксис за логическо сравнение от традиционната математика. Математическият израз 3 < a < 15 означава, че „3 е по-малко от a и а е по-малко от 15.“ Въпреки това, както видяхте, C++ интерпретира този израз по различен начин.

За да представите и в C++, използвайте оператора &&. След това можете да свържете булеви изрази заедно и да изградите логика, използвайки оператори като && да представлява И, || за представяне на ИЛИ и ! да представлява НЕ. Езици като Java използва същите логически оператори.

Използвайки правилния логически оператор, можете да коригирате грешката в по-ранния пример:

#включват
вътр а = 15;

вътросновен()
{
ако (3 < a && a < 10)
{
std::cout << "фу" << std::endl;
}
друго
{
std::cout << "бу" << std::endl;
}

връщане0;
}

Сега този код ще тества дали стойността a е по-голяма от 3 и дали стойността a е по-малка от 10. Компилирайте и стартирайте програмата и наблюдавайте резултата.

Предишният пример отпечата "foo", но програмата сега отпечатва "boo", както е предвидено. Булевата стойност от лявата страна на сравнението (3 < a) е вярна. Стойността на дясната страна (a < 10) е невярна. От вярно и невярно е винаги невярно, общият израз се оценява като false, така че това условие е неуспешно и друго блокови писти.

Опитайте да превключите И (&&) оператор към ИЛИ (||) и наблюдаване на различния резултат.

Значението на логическите проверки в C++

Логическите сравнения в C++ включват използването на булеви стойности и оператори за сравнение. Уверете се, че използвате правилните булеви стойности и оператори за сравнение, за да контролирате работата на вашите програми. Може да е трудно да се забележат зле формирани изрази, защото C++ често ще изпълнява различно поведение, вместо да се провали напълно.

Сега знаете как компилаторите игнорират този проблем и третират всяко сравнение като булево при четене отляво надясно. Внимавайте за този проблем на всеки език, който използвате, и се научете да разпознавате ефектите му, за да можете да бъдете една крачка напред.