exponenta event banner

MISRA C++: 2008 Правило 5-2-1

Каждый операнд логического & & или | | должен быть постфиксным выражением

Описание

Определение правила

Каждый операнд логического & & или | | должен быть постфиксным выражением.

Объяснение

Это правило фактически требует, чтобы операнды логического && или || операция должна быть соответствующим образом заключена в скобки. Например, вместо a + b || c, правило требует (a + b) || c или a + (b || c). В обоих соответствующих случаях левый операнд ||, то есть (a + b) или b, является первичным выражением и, следовательно, также постфиксным выражением. Дополнительные сведения о постфиксных выражениях см. в стандарте C++ 03 (раздел 5.2).

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

Внедрение Polyspace

Средство проверки вызывает нарушение, если логическое && или || операнд не является постфиксным выражением.

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

  • Вызов функции, например func().

  • Доступ к элементу массива, например arr[].

  • Доступ к члену структуры, например aStructVar.aMember.

Полный список постфиксных выражений см. в стандарте C++ 03 (раздел 5.2).

Средство проверки допускает исключения в ассоциативных цепях, таких как (a && b && c) или (a || b || c).

Поиск неисправностей

Если вы ожидаете нарушения правила, но не видите его, обратитесь к разделу Нарушения стандартов кодирования не отображаются.

Примеры

развернуть все

bool Operations(bool a, bool b, bool c, bool priority) {
    bool res;
    if(priority) {
        res = a && b || c;  //Noncompliant
    }
    else {
        res = a && (b || c); //Compliant
    }
    return res;
}

В этом примере выражение a && b || c нарушает правило, поскольку правильный операнд && и левый операнд || не являются постфиксными выражениями.

Проверить информацию

Группа: Выражения
Категория: Обязательно
Представлен в R2013b