Гайд Перевод Learncpp.com: раздел 3.1 // Синтаксические и семантические ошибки. На русском.

Dreammmless.
Эксперт
Статус
Оффлайн
Регистрация
19 Мар 2019
Сообщения
2,957
Реакции[?]
962
Поинты[?]
1K
Было решено сделать небольшой скачок до интересной темы: Отладка, которая понадобится начинающим и не очень.



Ошибки ПО распространены. Их легко сделать, и их трудно найти. В этой главе мы рассмотрим темы, связанные с поиском и удалением ошибок в наших программах на языке C++, в том числе научимся использовать встроенный отладчик, который является частью нашей IDE.

Хотя инструменты и методы отладки не являются частью стандарта C++, умение находить и удалять ошибки в программах, которые вы пишете, является чрезвычайно важной частью успешного программиста. Поэтому мы потратим немного времени на освещение таких тем, чтобы по мере усложнения программ, которые вы пишете, ваша способность диагностировать и устранять проблемы развивалась с той же скоростью.

Если у вас есть опыт отладки программ на другом скомпилированном языке программирования, многое из этого будет Вам знакомо.


Синтаксические и семантические ошибки

Программирование может быть сложным, а C++ - это несколько причудливый язык. Сложите эти два понятия вместе, и вы обнаружите множество способов совершать ошибки. Ошибки обычно делятся на две категории: синтаксические ошибки и семантические ошибки (логические ошибки).

Синтаксическая ошибка возникает, когда вы пишете стейтмент, который не является допустимым в соответствии с грамматикой языка C++. Это включает в себя такие ошибки, как пропущенные точки с запятой, использование необъявленных переменных, несоответствующие скобки или фигурные скобки и т. д. Например, следующая программа содержит довольно много синтаксических ошибок:

C++:
#include <iostream>

int main()
{
    std::cout < "Hi there"; < < x; // недопустимый оператор (<), лишняя точка с запятой, необъявленная переменная (x)
    return 0 // отсутствует точка с запятой в конце стейтмента
}
К счастью, компилятор обычно ловит синтаксические ошибки и генерирует предупреждения или ошибки, поэтому вы легко определяете и устраняете проблему. Тогда это просто вопрос времени, пока вы не избавитесь от всех ошибок.

Как только ваша программа компилируется правильно, заставить ее действительно выдавать желаемый результат(ы) может быть непросто. Семантическая ошибка возникает, когда стейтмент синтаксически корректен, но не выполняет то, что задумал программист.

Иногда это приведет к сбою вашей программы, например, в случае деления на ноль:
C++:
#include <iostream>

int main()
{
    int a = 10;
    int b = 0;
    std::cout << a << " / " << b << " = " << a / b; // деление на 0 не определено
    return 0;
}
Чаще всего они просто производят неправильное значение или поведение:
C++:
#include <iostream>

int main()
{
    int x;
    std::cout << x; // Использование неинициализированной переменной приводит к неопределенному результату

    return 0;
}
или
C++:
#include <iostream>

int add(int x, int y)
{
    return x - y; // предполагается, что функция добавляет, но это не так
}

int main()
{
    std::cout < < add(5, 3); // должно произвести 8, но производит 2

    return 0;
}
или
C++:
#include <iostream>

int main()
{
    return 0; // функция возвращается здесь

    std:: cout <<  "Hello, world!"; // так что это никогда не выполнится
}
Современные компиляторы стали лучше выявлять некоторые типы распространенных семантических ошибок (например, использование неинициализированной переменной). Однако в большинстве случаев компилятор не сможет поймать большинство из этих типов проблем, потому что компилятор предназначен для обеспечения соблюдения грамматики, а не намерения.

В приведенном выше примере ошибки довольно легко обнаружить. Но в большинстве нетривиальных программ семантические ошибки не так-то просто обнаружить, изучив код. Именно здесь могут пригодиться методы отладки.

Оригинальная статья -
Пожалуйста, авторизуйтесь для просмотра ссылки.
 
Сверху Снизу