Любое преимущество использования assert вместо использования простого "если"?
учитывая этот код :
#include <stdio.h>
#include <assert.h>
void print_number(int* somePtr) {
assert (somePtr!=NULL);
printf ("%dn",*somePtr);
}
int main ()
{
int a=1234;
int * b = NULL;
int * c = NULL;
b=&a;
print_number (c);
print_number (b);
return 0;
}
Я могу сделать это вместо этого:
#include <stdio.h>
#include <assert.h>
void print_number(int* somePtr) {
if (somePtr != NULL)
printf ("%dn",*somePtr);
// else do something
}
int main ()
{
int a=1234;
int * b = NULL;
int * c = NULL;
b=&a;
print_number (c);
print_number (b);
return 0;
}
Итак, что я получаю, используя assert ?
в отношении
5 ответов
assert-документировать ваши предположения в коде. оператор if должен обрабатывать различные логические сценарии.
теперь в вашем конкретном случае подумайте с точки зрения разработчика функции print_number ().
например, когда вы пишите
void print_number(int* somePtr) {
assert (somePtr!=NULL);
printf ("%d\n",*somePtr);
}
ты хочешь сказать, что,
в моей функции print_number I предположим это всегда указатель не является нулевым. Я был бы очень очень удивлен если это null. Я вообще не хочу обрабатывать этот сценарий в своем коде.
но, если вы пишите
void print_number(int* somePtr) {
if (somePtr != NULL)
printf ("%d\n",*somePtr);
// else do something
}
Вы, кажется, говорите, что в моей функции print_number я ожидал люди, чтобы передать нулевой указатель. И я знаю, как справиться с этой ситуацией, и я справляюсь с этим с другим условием.
Итак, иногда вы знаете, как обращаться с определенными ситуациями, и вы хотите это сделать. Затем используйте if. Иногда, вы предполагаете, что что-то не произойдет, и вы не хотите с этим справляться. Вы просто выражаете свое удивление и останавливаете выполнение программы с помощью assert.
много причин:
- утверждения обычно удаляются для сборок выпуска.
- утверждает, что сообщит клиенту информацию о сбое.
if()
ничего не делает сама по себе. - поскольку утверждения обычно являются макросами, вы также можете получить информацию кода о неудачном утверждении.
- Assert более семантически ясен, чем
if()
.
разница в том, что std::assert
доступно только для debug build; он не включен для релиз build (i.e когда NDEBUG
определено), что означает, что в сборке выпуска не будет проверки; в результате ваш код будет немного быстрее, по сравнению с тем, в котором вы используете if
условие, которое остается в сборке выпуска.
, что значит std::assert
используется для проверки типичных ошибок при написании кода, и поймайте их как можно скорее, на самой стадии разработки.
если утверждение не выполняется, вы увидите вывод, содержащий само неудачное утверждение, а также функцию и строку неудачного утверждения, что-то вроде:
test: main.cpp:9: int main(): Assertion `0==1' failed.
Итак, если ваша программа завершает работу во время выполнения, вы увидите точную причину и место аварии. Есть большая статья об утверждениях в wiki.
Assert сообщит вам, что что-то не так, возможно, ошибка будет исправлена. В режиме отладки он сломается и покажет callstack, который поможет вам с исправлением ошибки. Так что это хорошая практика. Я бы фактически использовал if () и assert, потому что в выпуске ваши утверждения должны быть отключены:
void print_number(int* somePtr) {
assert(somePtr != NULL);
if (somePtr != NULL)
printf ("%d\n",*somePtr);
// else do something
}
в "/ / else do something " вы можете подумать о создании исключения или возврате кода ошибки.