AUTOSAR C++14 Rule A5-16-1

Троичный условный оператор не должен использоваться в качестве подмножества

Описание

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

Троичный условный оператор не должен использоваться в качестве подмножества.

Объяснение

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

Реализация Polyspace

Шашечные флаги используют троичный условный оператор в подэкспрессиях за некоторыми исключениями. Исключения включают использование оператора, когда:

  • Результат присваивается переменной.

  • Результат используется в качестве аргумента функции или возвращается из функции.

Поиск и устранение проблем

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

Примеры

расширить все

#include <cstdint>
const int ULIM = 100000;

std::int32_t foo(int32_t x) {
    int ret;
    ret = (x <= 0? 0: (x >= ULIM? 0 : x)); //Noncompliant
    return ret;
}

std::int32_t bar(int32_t x) {
    int ret, retInterim;
    retInterim = x >= ULIM? 0 : x; //Compliant
    ret = retInterim <= 0? 0 : retInterim; //Compliant
    return ret;
}

В этом примере, в fooтроичную условную операцию связывают второй операцией, чтобы вернуть значение 0, если x находится в области значений [0, ULIM] и возврат x в противном случае. Троичная операция сравнения x с ULIM является подэкспрессом в полной цепи и нарушает правило.

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

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

Группа: Выражения
Категория: Необходимый, Автоматизированный
Введенный в R2019b