Что такое утверждения? и почему вы их используете?

Как делаются утверждения в С++? Пример кода оценивается.

Ответы

Ответ 1

Asserts - это способ явной проверки допущений, которые делает ваш код, что помогает вам отслеживать множество ошибок, сужая возможные проблемы. Обычно они оцениваются только в специальной "отладочной" сборке вашего приложения, поэтому они не замедляют выпуск окончательной версии.

Скажем, вы написали функцию, которая указала указатель в качестве аргумента. Там есть хорошая вероятность, что ваш код будет считать, что указатель не является NULL, поэтому почему бы не явным образом проверить это с утверждением? Вот как:

#include <assert.h>

void function(int* pointer_arg)
{
    assert(pointer_arg != NULL);

    ...
}

Важно отметить, что выражения, которые вы утверждаете, никогда не должны иметь побочных эффектов, поскольку они не будут присутствовать в сборке релизов. Поэтому никогда не делайте что-то вроде этого:

assert(a++ == 5);

Некоторые люди также любят добавлять небольшие сообщения в свои утверждения, чтобы дать им смысл. Поскольку строка всегда возвращает значение true, вы можете написать следующее:

assert((a == 5) && "a has the wrong value!!");

Ответ 2

Утверждение - это логические выражения, которые обычно должны быть истинными.

Они используются для обеспечения того, что вы ожидали, и того, что происходит.

void some_function(int age)
{
     assert(age > 0);
}

Вы написали функцию, чтобы иметь дело с возрастом, вы также "знаете", что вы всегда передаете разумные аргументы, тогда вы используете утверждение. Мне нравится говорить "Я знаю, что это никогда не пойдет не так, но если да, то я хочу знать", потому что, ну, все делают ошибки.

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

Утверждения, как правило, предназначены только для отладочных сборников, поэтому не ставьте код с побочными эффектами в утверждениях.

Ответ 3

Утверждения используются для проверки расчетных допущений, обычно с точки зрения входных параметров и результатов возврата. Например

// Given customer and product details for a sale, generate an invoice

Invoice ProcessOrder(Customer Cust,Product Prod)
{
  assert(IsValid(Cust));
  assert(IsValid(Prod);
'
'
'
  assert(IsValid(RetInvoice))
   return(RetInvoice);

}

Операторы assert не требуются для запуска кода, но проверяют правильность ввода и вывода. Если вход недействителен, в вызывающей функции появляется ошибка. Если вход действителен, а вывод недопустим, в этом коде есть ошибка. Подробнее об этом использовании утверждений см. дизайн по контракту.

Изменить: Как указано в других сообщениях, реализация assert по умолчанию не включена в время выполнения релиза. Обычная практика, которую многие будут использовать, в том числе и я, - заменить ее версией, включенной в сборку выпуска, но вызывается только в режиме диагностики. Это позволяет провести надлежащее регрессионное тестирование на выпусках с полной проверкой утверждений. Моя версия выглядит следующим образом:

extern  void _my_assert(void *, void *, unsigned);

#define myassert(exp)                               \
{                                                   \
    if (InDiagnostics)                              \
        if ( !(exp) )                               \
            _my_assert(#exp, __FILE__, __LINE__);   \
}                                                   \

В этом методе есть небольшая нехватка времени выполнения, но она делает отслеживание любых ошибок, которые сделали его в поле намного проще.

Ответ 4

Используйте утверждения для проверки ситуаций "не может быть".

Типичное использование: проверьте недопустимые/невозможные аргументы в верхней части функции.

Редко встречается, но все же полезно: инварианты цикла и постусловия.

Ответ 5

Утверждения - это утверждения, позволяющие вам проверить любые допущения, которые могут возникнуть в вашей программе. Это особенно полезно для документирования вашей логики программы (предварительные условия и постусловия). Утверждения, которые выходят из строя, обычно вызывают ошибки времени выполнения, и являются признаками того, что что-то ОЧЕНЬ неправильно с вашей программой - ваше утверждение не сработало, потому что то, что вы считали истинным, не было. Обычными причинами являются: в вашей логике функций есть недостаток, или вызывающая функция передала вам плохие данные.

Ответ 6

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

Ответ 7

Это не относится к объекту assert, который дошел до нас с ранних C-дней, но вы также должны знать Boost StaticAssert, если ваши проекты могут использовать Boost.

Стандартное утверждение C/С++ работает во время выполнения. Средство Boost StaticAssert позволяет вам делать некоторые классы утверждений во время компиляции, ловя логические ошибки и т.п. Еще раньше.

Ответ 8

Вот определение того, что такое утверждение, и здесь - это пример кода. Вкратце утверждение является способом для разработчика проверить его (или ее) предположения о состоянии кода в любой заданной точке. Например, если вы делаете следующий код:

mypointer->myfunct();

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