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


много причин:

  1. утверждения обычно удаляются для сборок выпуска.
  2. утверждает, что сообщит клиенту информацию о сбое. if() ничего не делает сама по себе.
  3. поскольку утверждения обычно являются макросами, вы также можете получить информацию кода о неудачном утверждении.
  4. 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 " вы можете подумать о создании исключения или возврате кода ошибки.