ПроблемаInvalid use of = operator происходит, когда назначение выполняется внутри предиката условного, такого как if
или while
.
В C и C++ один знак равенства является назначением, а не сравнением. Использование одинарного знака равенства в условном операторе может указывать на опечатку или ошибку.
РискУсловный оператор проверяет неправильные значения - операция одинарного знака равенства присваивает значение правого операнда левому операнду. Затем, поскольку это назначение находится внутри предиката условного, программа проверяет, является ли новое значение левого операнда ненулевым или нет NULL.
Проблемы обслуживания и читаемости - даже если назначение предназначено, кто-то, читающий или обновляющий код, может неправильно истолковать назначение как сравнение равенств вместо назначения.
ЗафиксироватьЕсли назначение является ошибкой, для проверки на равенство добавьте второй знак равенства (==
).
Если назначение внутри условного оператора было преднамеренным, для улучшения читаемости разделите назначение и тест. Переместите назначение за пределы оператора управления. В операторе управления просто проверьте результат назначения.
Если вы не хотите устранять проблему, добавьте комментарии к своему результату или коду, чтобы избежать другой проверки. Смотрите Адрес Результаты Polyspace через исправления ошибок или обоснования.
Пример - Один знак равенства внутри if
Состояние#include <stdio.h>
void bad_equals_ex(int alpha, int beta)
{
if(alpha = beta)
{
printf("Equal\n");
}
}
Знак равенства помечен как дефект, потому что оператор назначения используется в предикате оператора if-оператора. Предикат присваивает значение beta
на alpha
, затем неявно проверяет, alpha
ли
имеет значение true или false.
Коррекция - изменение выражения на сравнение
Одной из возможных коррекций является добавление дополнительного знака равенства. Эта коррекция изменяет присвоение на сравнение. Условие if сравнивает, alpha
и beta
равны.
#include <stdio.h>
void equality_test(int alpha, int beta)
{
if(alpha == beta)
{
printf("Equal\n");
}
}
Коррекция - Назначение и сравнение внутри if
Состояние
Если назначение должно быть сделано внутри предиката, возможная коррекция добавляет явное сравнение. Эта коррекция присваивает значение beta
на alpha
затем явно проверяет, alpha
ли
является ненулевым. Код понятнее.
#include <stdio.h>
int assignment_not_zero(int alpha, int beta)
{
if((alpha = beta) != 0)
{
return alpha;
}
else
{
return 0;
}
}
Коррекция - Перемещение назначения за пределы if
Оператор
Если присвоение может быть выполнено вне оператора управления, одной из возможных коррекций является разделение присвоения и сравнения. Эта коррекция присваивает значение beta
на alpha
перед if. Внутри условия if, только alpha
дается для тестирования, если alpha
не имеет нуля или не имеет NULL.
#include <stdio.h>
void assign_and_print(int alpha, int beta)
{
alpha = beta;
if(alpha)
{
printf("%d", alpha);
}
}