Любое преимущество использования 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 " вы можете подумать о создании исключения или возврате кода ошибки.