Обоснование обеспечивается правилом: строгая типизация.Управляющее выражение должно быть по существу логическим типом.Результат операторов равенства, реляционных и т. Д. Должен рассматриваться как по существу логический, тогда как показ в int
или указатель без оператора означает, что выражение имеет используемый тип.
(Как примечание, это может быть важно для совместимости с C ++, где многие операторы действительно возвращают bool
и могут быть перегружены функцией operator
, возвращающей bool
.)
Однако основная причина не указана MISRA, а именно самодокументированным кодом.if(ptr != NULL)
может быть только сравнением указателя с NULL.Нет места для недоразумений.if(ptr)
может быть либо сравнением с NULL, либо случайным движением пальца, и программист действительно имел в виду if(*ptr)
.Кроме того, если указатель имеет какое-то загадочное имя, не очевидно, что делает if(xyz)
, но очевидно, что такое if(xyz != NULL)
.
Это правило также предотвращает ошибки, такие как if(func)
, где if(func())
был предназначен.Имейте в виду, что многие правила MISRA существуют для статического анализатора.
Что касается строгой типизации, рассмотрите следующий пример:
#include <stdio.h>
#include <stdbool.h>
int main (void)
{
int x = false;
x = ~x;
if(x)
{
puts("x is true");
if(x!=true)
{
puts("but x is not true\n");
}
}
bool y = x;
if(y)
{
puts("y is true");
if(y==true)
{
puts("I swear, y is really true");
}
}
}
Вывод:
x is true
but x is not true
y is true
I swear, y is really true