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

[Д0] == сравнивает опорное значение объектов, тогда как equals() метод присутствует в java.lang.String класса сравнивает содержимое String объекта (к другому объекту).

13
задан Omar Kooheji 31 October 2008 в 11:46
поделиться

8 ответов

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

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

#include <assert.h>

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

    ...
}

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

assert(a++ == 5);

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

assert((a == 5) && "a has the wrong value!!");
33
ответ дан andygeers 31 October 2008 в 11:46
поделиться
  • 1
    Сохраните его простым:), Хотя Вы могли бы хотеть использовать что-то как <sys:Int32 x:Key="SpanAll">2147483647</sys:Int32> и Grid.RowSpan="{StaticResource SpanAll}", чтобы заставить других людей понять what' s продолжение:) – Fredrik Hedblad 12 January 2011 в 00:01

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

// 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);

}

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

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

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

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

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

5
ответ дан SmacL 31 October 2008 в 11:46
поделиться
  • 1
    Вы правы, это не очень ясно, скоро мы заменим его Видео:) – Ronen Morecki 23 March 2012 в 09:00

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

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

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

3
ответ дан mfx 31 October 2008 в 11:46
поделиться
  • 1
    Hehe да, что число является легко распознаваемым после многих лет разработки, но это выглядит довольно странным как RowSpan, оценивают, как кто-то отбросил что-то на клавиатуре:) – Fredrik Hedblad 12 January 2011 в 18:21

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

1
ответ дан Dave Markle 31 October 2008 в 11:46
поделиться
  • 1
    К сожалению, не, отключая частичное состояние, сохраняющее doesn' t решают проблему с тегами JSTL. Этот конкретный случай однако хитер. В теории можно решить это с fullworthy компонентом, например, <p:tabs>, который принимает набор вместо <ui:repeat><p:tab>. Я полагаю, что это когда-либо отправлялось как запрос новых функций на PrimeFaces, не уверенный, что Cagatay сделал с ним. – BalusC 4 April 2011 в 18:07

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

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

1
ответ дан Don Wakefield 31 October 2008 в 11:46
поделиться

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

mypointer->myfunct();

Вы, вероятно, хотите утверждать, что mypointer не является ПУСТЫМ, потому что это - Ваше предположение - что mypointer никогда не будет ПУСТЫМ перед вызовом.

0
ответ дан Onorio Catenacci 31 October 2008 в 11:46
поделиться

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

2
ответ дан Maxam 31 October 2008 в 11:46
поделиться
  • 1
    Ваше корректное. Я добавил функцию к веб-сайту, который использует c:foreach на моей странице. Неудивительный я didn' t замечают его прежде. Проблемой является ui:repeat, не будет работать в моем случае. primefaces.prime.com.tr/forum/viewtopic.php? f=3& t=59 частичное укажет работу сохранения с c:for каждый? – Drew H 4 April 2011 в 17:55

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

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

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

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

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

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

6
ответ дан Pieter 31 October 2008 в 11:46
поделиться
  • 1
    Вы называете это простым? Если you' ре, собирающееся ссылаться на Систему, Вы могли бы также использовать {x:Static sys:Int32. MaxValue} непосредственно я говорю. – H.B. 12 January 2011 в 00:10
Другие вопросы по тегам:

Похожие вопросы: