Я изучал C ++ в течение двух месяцев, и сейчас я изучаю главу в моей книге (Принципы программирования и практика с использованием C ++) об ошибках. Но после изучения первых страниц у меня возник вопрос: В чем разница между ошибкой во время выполнения и логической ошибкой? Согласно моей книге ошибка во время выполнения — это ошибка, обнаруженная проверками во время выполнения, и мы можем далее классифицировать ошибки времени выполнения как:
- аппаратная ошибка / ошибка операционной системы
- ошибки, обнаруженные библиотекой
- ошибки, обнаруженные кодом пользователя (что такое код пользователя?)
в то время как логические ошибки — просто ошибки, найденные программистом, ищущим причины ошибочных результатов.
Я думал, что понял это различие, но затем приведенный автором пример вызвал у меня сомнения. Это пример:
#include «std_lib_facilities.h» int area(int lenght, int width) // calculate area of rectangle < return lenght * width; >int framed_area(int x, int y) // calculate area within frame < return area(x — 2, y — 2); >int main() < int x = -1; int y = 2; int z = 4; int area1 = area(x, y); int area2 = framed_area(1, z); int area3 = framed_area(y, z); double ratio = double(area1) / area3; >
Вот что кратко говорит автор об этом примере:
В чём сущность логических ошибок?|Логические ошибки|А.И. Уёмов|Глава 1|Аудиокнига
вызовы функций area () и framed_area () приводят к отрицательному
значения, представляющие области, присваиваемые области1 и области2. Должен
мы принимаем такие ошибочные результаты? Но прежде чем ответить на этот вопрос
посмотрите на расчет коэффициента, при расчете коэффициента площадь3
будет 0, а деление с 0 приведет к аппаратно обнаруженной ошибке
это завершает программу с каким-то загадочным сообщением. Это
ошибка, с которой вам или вашему пользователю придется иметь дело, если вы
не обнаруживать и разумно иметь дело с ошибками во время выполнения.
Я не понимаю, почему отрицательное значение, используемое в качестве аргумента для функции, вычисляющей площадь, рассматривается как ошибка времени выполнения, не является ли это просто логической ошибкой? Я думал, что ошибки времени выполнения были только ошибками, вызванными, например, делением числа на 0 и другими частными случаями. Я ошибаюсь или я просто что-то неправильно понимаю? В чем реальная разница между ошибками логики и ошибками во время выполнения? Не могли бы вы показать мне несколько небольших примеров?
Решение
Ошибка времени выполнения может законно произойти: например, какой-то файл, содержащий мусорные данные, или неправильный ввод данных человеком, или некоторый недостаток ресурсов (больше нет памяти, недостаточно места на диске, сломано оборудование, сбой сетевого подключения).
Логическая ошибка (или сбой assert ….) по определению всегда симптом некоторой ошибки в программе, например, предположительно отсортированный массив, используемый для дихотомического доступа, который оказывается несортированным.
Логические ошибки
станд :: logic_error : Этот класс определяет тип объектов, выданных как исключения для сообщений об ошибках во внутренней логике программы, таких как нарушение логических предварительных условий или инвариантов класса.
станд :: runtime_error : Этот класс определяет тип объектов, создаваемых как исключения для сообщений об ошибках, которые могут быть обнаружены только во время выполнения.
я полагаю, что внутренняя логика за std::logic_error это опечатка, я понимаю это как внутренняя логика (программы), но я не являюсь носителем английского языка.
Если вы формализуете спецификацию вашей программы (например, с помощью Frama C используя ACSL), вы можете обнаружить (и, возможно, исправить) логические ошибки; но вы должны заботиться об ошибках во время выполнения. Но вы также можете иметь ошибки в спецификации.
Прочитать о Ариан 5, сбой рейса 501 . И посмотрите в Блог Я. Питрата чтобы получить другие взгляды.
Другие решения
Ваша книга, безусловно, права в первом подразделе, время компиляции или время выполнения.
Если вы можете, убедитесь, что вы получите первый вместо второго, так как он автоматически определяется.
Также верно, что оба могут быть далее подразделены, но давайте посмотрим только на последнее:
- Внешняя ошибка: аппаратная ошибка / ошибка операционной системы Ожидаются многие из них, например, ненадежность сети, отсутствие файла пользователя и тому подобное. Часто от них можно оправиться. Другие являются неожиданными и часто не подлежащими восстановлению, такими как отсутствие требуемой зависимости, ненадежная оперативная память, нехватка времени и тому подобное. Ожидайте просто разбить и сжечь.
- Ошибка ввода: искаженные входные данные, отсутствующие входные данные, что угодно. Это должно быть обнаружено вашим приложением, которое в зависимости от серьезности ошибки может заменить значения по умолчанию, попытаться восстановить его или просто аварийно завершить работу.
- Логическая ошибка: фундаментальные предположения программы были найдены несоответствующими. Ничто не может зависеть от того, чтобы держаться дольше, единственный разумный вариант — немедленно разбить и сжечь, чтобы попытаться сдержать урон. Распространенными логическими ошибками являются ошибки фехтовального поста (не по одному), условия гонки, использование после освобождения и тому подобное.
Быть в курсе, что std::logic_error Несмотря на свое название, он не всегда должен означать фатальный сбой в логике программ и, следовательно, может быть ожидаемым и относительно мягким.
Логические ошибки происходят из-за недостатков в мышлении программиста и их можно предотвратить. Например, забыв защитить от недопустимых ошибок в массиве.
Ошибки времени выполнения, с другой стороны, возникают из-за архитектуры компьютера и операционной системы и находятся вне контроля программиста и не могут быть легко предсказаны во время кодирования.
Что касается предоставленного вами примера, предоставление отрицательного ввода в область вычисления метода является логической ошибкой, поскольку вы уже (как разработчик приложения) знаете, что это неправильно. Но предположим, что вы написали метод расчета площади и передали его пользователю, который не знает, что такое вычисляемая площадь — он может предоставить неверные данные, что приведет к неверным результатам. В этом случае это будет ошибка времени выполнения, поскольку пользователь не знает об этом, и проверка на месте не производится.
#include using std::cout; using namespace std; int area(int lenght, int width) // calculate area of rectangle < return lenght * width; >int framed_area(int x, int y) // calculate area within frame < return area(x — 2, y — 2); >int main()
Как насчет того, чтобы попробовать это, нет ошибки во время выполнения, я не знаю, как вы можете увидеть результат без cout.
Я тоже новичок, я думаю, что важно учиться в короткие сроки во время учебы.
Это только мое предложение, так как два ответа выше хорошо объяснили.
Из моего опыта с собой :)…
Путаница может возникнуть из-за того, что мы «упрощаем жизнь», повторно используя логику исключений std, когда мы должны создать ее для себя. Стандартные исключения должны быть пойманный (не брошен) по нашему коду. Они информируют нас о том, что произошло при вызове функции из библиотеки std, и логика дерева наследования исключений не просто переносима за пределы библиотеки.
std::runtime_error говорит нам Ха! Произошло что-то непредсказуемое
std::logic_error говорит нам Ой ой! Вы пропустили что-то важное в своем коде
Ваш босс может написать программу, как
try < mainCall(); >catch (const std::logic_error std::cout catch(const std::runtime_error std::cin >> a; std::cin >> b; if (b == 0) EXCEPTION; else std::cout
Так что же EXCEPTION лайк? Это runtime_error или logic_error ?
- Случилось ли что-то непредсказуемое? Можно ли ожидать, что пользователь вводит 0 для b? Да, мы могли, и мы, действительно, сделали! Так что не должно быть runtime_error ,
- Мы пропустили что-то важное в нашем коде? Нет, мы не! Так что не должно быть logic_error или.
Логическая ошибка
В компьютерном программировании , логическая ошибка является ошибкой в программе , которая заставляет его работать неправильно, но не прекратить ненормально (или врезаться ). Логическая ошибка приводит к непреднамеренному или нежелательному результату или другому поведению, хотя ее нельзя сразу распознать как таковую.
Логические ошибки возникают как в компилируемых, так и в интерпретируемых языках. В отличие от программы с синтаксической ошибкой , программа с логической ошибкой является допустимой программой на языке, хотя ведет себя не так, как задумано. Часто единственный ключ к существованию логических ошибок — это получение неправильных решений, хотя статический анализ иногда может их обнаружить.
Один из способов найти этот тип ошибки — поместить переменные программы в файл или на экран, чтобы определить местоположение ошибки в коде. Хотя это не сработает во всех случаях, например, при вызове неправильной подпрограммы , это самый простой способ найти проблему, если программа использует неверные результаты плохого математического расчета .
Этот пример функции на языке C для вычисления среднего двух чисел содержит логическую ошибку. В вычислении отсутствуют круглые скобки, поэтому он компилируется и запускается, но не дает ожидаемого ответа из-за приоритета оператора (деление оценивается перед сложением).
Источник: wblog.wiki
Как избежать логических ошибок в тексте
197110, Россия, Санкт-Петербург, а/я 144, ООО «Юми» +7 (812) 309-68-23
Пропущенную в тексте запятую или неправильно написанное слово помогают найти специальные сервисы. Куда сложнее с логическими ошибками, которые не поддаются пониманию программ. Эти ошибки портят впечатление от текста и заставляют читателя задуматься о профессионализме автора. В этой статье мы выясним, что нужно делать для избежания логических ошибок в контенте.
Законы логики
Помните об этих законах, когда приступаете к написанию нового материала, и проблем с логическими ошибками не возникнет.
Тождество
Рассказывая о каком-либо понятии, позаботьтесь о том, чтобы у читателя не возникло другого понимания этого слова. Проверяйте значение тех слов, которые вызывают сомнение. Часто автор использует понятие в одном значении, совершенно не догадываясь, что читатель воспринимает его совсем по-другому. Яркий пример — «двуспальная» вместо «двухъярусная» или «балкон» вместо «лоджии».
Противоречие
Описание одного и того же предмета не может одновременно содержать противоположные фразы. Остерегайтесь слов-преувеличений: «самый», «однозначно», «наиболее». Они чаще всего ставят подножку логике текста. Пример:
«Самым лучшим музыкантом прошлого тысячелетия был Моцарт. Хотя в таланте ему не уступал Бах».
Исключение третьего
Иногда текст составлен так, что два предложения противоречат друг другу. В этом случае оставляйте истинное предложение и убирайте неверный текст, третьего не дано. Пример: «Договаривайся о встрече заранее и не предупреждай, если нужно перенести дату». Частица «не» здесь лишняя.
Доказательство
Всякое утверждение в тексте должно основываться на неоспоримом факте. Если вы ссылаетесь на исследования, то прикрепляйте ссылку на источник или приводите доказательства. Пример: «С работой ночного сторожа сможет справиться любой человек». Здесь утверждение основывается на личном мнении рассказчика. В реальности далеко не каждому человеку под силу работать ночным сторожем.
В этом примере автору следовало бы построить предложение менее категорично.
Борьба с логическими ошибками
Никакого волшебного способа искоренить логические ошибки по щелчку пальца не существует. Нужно лишь обращать внимание на распространенные причины появления этих ошибок и вовремя с ними бороться.
Невнимательность
Это основная причина возникновения логических ошибок. Рекомендуем перечитывать написанный текст, причем делать это желательно после перерыва на другое занятие. Свежий взгляд поможет обнаружить недочеты, которые скрывались от автора ранее.
Блеснуть умом
Нередко автор текста желает вставить в материал умное слово, чтобы подчеркнуть свою эрудицию. Иногда такие решения приводят к казусам, потому что слова используются неправильно и не подходят по смыслу.
Объем
Обилие воды и чересчур большие конструкции предложения могут объясняться тем, что автору требовалось написать текст определенного объема. Здесь совет прост — старайтесь выполнить нужный объем за счет полезной информации.
Итого
Большинство логических ошибок легко избежать, если помнить об основных законах логики и перечитывать написанный текст после занятия другим делом. Проверяйте значение терминов, если не уверены в правильном использовании слов и упрощайте структуру текста, чтобы не попасть в собственные словесные джунгли. Оставайтесь с 1С-UMI и читайте новые статьи о продвижении своего бизнеса в интернете.
Источник: umi.ru