Если вы пришли к программированию с математическим образованием, эта тонкая деталь может легко вас зацепить.
C++ — это широко используемый язык программирования, но в нем наиболее распространены ошибки программирования. Многие из этих ошибок связаны с логическими ошибками. В частности, ошибки, допущенные во время операций сравнения, могут повлиять на точность и надежность вашего кода.
В языке C++ есть одна специфическая ошибка сравнения, которую упускают из виду многие новые разработчики. Эта ошибка возникает из-за неправильного понимания того, как работают операторы при выполнении множественных сравнений. Узнайте, как избежать этой распространенной ошибки и почему она вообще возникает.
Сравнения в C++
Язык программирования C++ предлагает множество различных функций и инструментов, а также основные операции, такие как операторы сравнения. Операторы сравнения — это специальные операции в языках программирования, которые можно использовать для сравнения данных друг с другом. Разработчики используют эти операторы довольно часто, особенно при создании алгоритмов.
Вы можете видеть операторы сравнения во многих различных примерах из повседневной жизни. Например, когда вы делаете покупки в продуктовом магазине, вы используете этих операторов для сравнения цен. Если цена одного товара ниже цены другого, вы выбираете этот товар.
Вы можете увидеть операторы сравнения в операторы if-else довольно часто. Операторы сравнения — это место, где можно проверить, является ли одно значение большим, меньшим или равным другому значению. Есть очень маленькая, но важная деталь, которую нельзя упускать из виду. Результаты выражений сравнения возвращают true или false, которые являются логическими значениями. Эти значения являются одним из основных компонентов структуры управления в программировании.
Например, в языке программирования C++ "==" оператор проверяет, равны ли два значения. Если значения равны, результат возвращает true. В противном случае результат будет ложным.
если (а == б)
{
возвращатьсяистинный;
}
еще
{
возвращатьсяЛОЖЬ;
}
Пример задачи сравнения
Одной из распространенных ошибок начинающих программистов на C++ является использование операторов сравнения. Эти операторы позволяют программистам сравнивать два значения и выполнять различные операции на основе результата этого сравнения. Однако неправильное использование этих операторов может привести к непредвиденным ошибкам.
Например, хотя выражение 3 < 15 < 10 математически неверно, C++ считает его результат истинным. Вы можете продемонстрировать это, написав следующую простую тестовую программу.
Сначала создайте файл с именем test.cpp. Откройте этот файл, используя ваш любимый редактор кода и добавьте в него следующий код.
#включать
инт а = 15;интосновной()
{
если (3 < а < 10)
{
станд.::cout << "фу" << станд.::конец;
}
еще
{
станд.::cout << "бу" << станд.::конец;
}
возвращаться0;
}
Вы можете использовать эту команду для компиляции и запуска кода:
g++ test.cpp -o Тест
Теперь у вас есть программа под названием Тест. Запустите программу и проверьте ее вывод.
C++ считал, что 3 < 15 < 10 верно при запуске этой программы. Почему результат может получиться именно таким, даже если это математически неверное утверждение?
Причины проблемы сравнения в C++
Как и большинство языков программирования, C++ читает код слева направо. Каждый оператор сравнения выдает логическое значение. Логические значения не просто означают истину и ложь; у них есть математический эквивалент.
Принцип работы компьютер зависит от единиц и нулей. Для компьютера результат чего-либо либо истинен, либо ложен. Компьютерные программы обычно воспринимают число 1 как истинное, а число 0 — как ложное.
Снова изучите задачу сравнения и прочитайте утверждение слева направо; вы увидите, что есть два разных сравнения. Первое сравнение между числами 3 и 15. Это истинное значение, потому что 3 меньше 15.
Второе сравнение проводится между этим результатом и числом 10. Поскольку необходимо выполнить числовое сравнение, C++ молча преобразует логическое значение true в 1. 1 меньше 10, поэтому общий результат верен.
В заключение, хотя это и кажется математической ошибкой, это утверждение справедливо для C++ и компьютеров.
Как решить задачи сравнения в C++
C++, наряду с большинством других языков программирования, использует синтаксис для логического сравнения, отличный от традиционной математики. Математическое выражение 3 < a < 15 означает «3 меньше a и а меньше 15». Однако, как вы видели, C++ интерпретирует это выражение иначе.
Для представления и в C++ используйте оператор &&. Затем вы можете связать логические выражения вместе и построить логику, используя такие операторы, как && представлять И, || представлять ИЛИ, и ! представлять НЕ. Такие языки, как Java использует те же логические операторы.
Используя правильный логический оператор, вы можете исправить ошибку в предыдущем примере:
#включать
инт а = 15;интосновной()
{
если (3 < а && а < 10)
{
станд.::cout << "фу" << станд.::конец;
}
еще
{
станд.::cout << "бу" << станд.::конец;
}
возвращаться0;
}
Теперь этот код будет проверять, больше ли значение a 3 и меньше ли значение a 10. Скомпилируйте и запустите программу и посмотрите на результат.
В предыдущем примере было напечатано «foo», но теперь программа печатает «boo», как и предполагалось. Логическое значение левой части сравнения (3 < a) истинно. Значение правой части (а < 10) ложно. С правда и ложь всегда ЛОЖЬ, общее выражение оценивается как ложное, так что условие не выполняется, и еще блок работает.
Попробуйте переключить И (&&) к оператору ИЛИ (||) и наблюдая за другим результатом.
Важность логических проверок в C++
Логические сравнения в C++ включают использование логических значений и операторов сравнения. Убедитесь, что вы используете правильные логические значения и операторы сравнения для управления работой ваших программ. Может быть трудно определить неправильно сформированные выражения, потому что C++ часто ведет себя по-другому, а не полностью завершается ошибкой.
Теперь вы знаете, как компиляторы игнорируют эту проблему и рассматривают каждое сравнение как логическое значение при чтении слева направо. Следите за этой проблемой на любом языке, который вы используете, и научитесь распознавать ее последствия, чтобы быть на шаг впереди.