Правила приоритета операторов вызывают неожиданный порядок оценки в арифметическом выражении
Этот дефект возникает, когда результат арифметического выражения, возможно, непреднамеренен, потому что правила приоритета оператора диктуют порядок оценки, который вы не ожидаете.
Дефект подсвечивает выражения формы x
. Здесь, op_1
y op_2
zop_1
и op_2
являются комбинациями операторов, которые обычно вызывают эту ошибку. Для образца, x == y | z
.
Шашка не помечает все комбинации операторов. Для образца, x == y || z
не помечен, потому что вы, скорее всего, намеревались выполнить логическое ИЛИ между x == y
и z
. В частности, шашка помечает следующие комбинации:
&&
и ||
: Для образца, x || y && z
или x && y || z
.
Назначение и побитовые операции: Например, x = y | z
.
Операции присвоения и сравнения: Например, x = y != z
или x = y > z
.
Операции сравнения: Например, x > y > z
(кроме тех случаев, когда одно из сравнений является равенством x == y > z
).
Сдвиг и числовая операция: Например, x << y + 2
.
Разыменование указателя и арифметика: Например, *p++
.
Дефект может вызвать следующие проблемы:
Если вы или другой рецензент кода просматриваете код, предполагаемый порядок оценки не сразу ясен.
Вполне возможно, что результат оценки не соответствует вашим ожиданиям. Для образца:
В операции *p++
Возможно, вы ожидаете, что разменяемое значение будет увеличено. Однако указатель p
приращение перед разыменованием.
В операции (x == y | z)
Возможно, что вы ожидаете x
для сравнения с y | z
. Однако ==
операция происходит перед |
операция.
Проверьте, является ли порядок оценки тем, что вы намереваетесь. Если нет, примените круглые скобки для реализации требуемого порядка оценки.
Для лучшей читаемости вашего кода рекомендуется применять круглые скобки для реализации порядка оценки, даже когда правила приоритета оператора накладывают этот порядок.
Группа: Программирование |
Язык: C | C++ |
По умолчанию: On для рукописного кода, off для сгенерированного кода |
Синтаксис командной строки: OPERATOR_PRECEDENCE |
Влияние: Высокий |
ИДЕНТИФИКАТОР CWE: 783 |