Проблема
Invalid use of = operator происходит, когда присвоение сделано в предикате условного выражения, такого как if
или while
.
В C и C++, один знак "равно" является присвоением не сравнение. Используя один знак "равно" в условном операторе может указать на опечатку или ошибку.
Риск
Условный оператор тестирует неправильные значения — одна операция знака "равно" присваивает значение правильного операнда к левому операнду. Затем потому что это присвоение в предикате условного выражения, проверки программы, является ли новое значение левого операнда ненулевым или не ПУСТЫМ.
Обслуживание и проблемы удобочитаемости — Даже если присвоение предназначается, кто-то чтение или обновление кода, могут неправильно истолковать присвоение как сравнение равенства вместо присвоения.
Фиксация
Если присвоение является ошибкой, чтобы проверять на равенство, добавьте второй знак "равно" (==
).
Если присвоение в условном операторе было намеренным, чтобы улучшить удобочитаемость, разделить присвоение и тест. Переместите присвоение вне оператора управления. В операторе управления просто протестируйте результат присвоения.
Если вы не хотите устранять проблему, добавьте комментарии в свой результат или код, чтобы избежать другого анализа. Смотрите Результаты 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.
Коррекция — выражение изменения к сравнению
Одна возможная коррекция добавляет дополнительный знак "равно". Эта коррекция изменяет присвоение на сравнение. Если условие выдерживает сравнение ли 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
перед, если. В если-условии, только alpha
дан тесту если alpha
является ненулевым или не ПУСТЫМ.
#include <stdio.h>
void assign_and_print(int alpha, int beta)
{
alpha = beta;
if(alpha)
{
printf("%d", alpha);
}
}