#c #c 11
#c #c 11
Вопрос:
У меня есть строка кода, которая выполняет как присваивание, так и условие. Я мог бы разделить его на две строки, но мне просто интересно узнать о выданном сообщении об ошибке.
if ( parameters->__size = m_Elements.size() )
Получена эта ошибка: предлагать круглые скобки вокруг присваивания, используемого в качестве истинностного значения [-Werror=круглые скобки]
Я пытался:
if ( (parameters->__size) = (m_Elements.size()) )
Ошибка не исчезает. Но я чувствую, что я сделал то, что мне было предложено сделать, и добавил круглые скобки вокруг назначения. Почему ошибка не исчезает? Что я упускаю?
Комментарии:
1.
if((parameters->__size = m_Elements.size()))
2. Обратите внимание, что
__size
идентификатор зарезервирован для языковой реализации, поэтому, если вы определяете элемент с этим именем, поведение программы будет неопределенным.
Ответ №1:
Чтобы убедить компилятор в том, что присваивание действительно то, что вы хотите, вам нужно заключить все выражение в круглые скобки, например:
if ( ( parameters->__size = m_Elements.size() ) )
//...
Без этого компилятор считает, что вы, возможно, допустили ошибку, используя присваивание ( =
) вместо оператора сравнения ( ==
) .
Комментарии:
1. Иногда кодирование
if ( ( parameters->__size = m_Elements.size() ) != 0 )
может сделать код более читаемым2. @BasileStarynkevitch Я согласен на 100%. Но, если программист ищет краткий код, который позволяет избежать предупреждений, то дополнительным вложением
(...)
является MNC (минимально необходимое изменение).
Ответ №2:
Предупреждение предлагает вам заключить в круглые скобки выражение присваивания, а не отдельные операнды. Вы можете отключить его с помощью
if ( ( parameters->__size = m_Elements.size() ) )
// ^ ^
Однако спросите себя, действительно ли это лучше, чем оригинал. Я полагаю, вы включили предупреждение по какой-то причине, и предлагаемое исправление действительно отключает предупреждение, но код все равно может вызвать ту же путаницу, что и раньше для читателя. Вы можете сделать это вместо:
parameters->__size = m_Elements.size();
if (parameters->__size)
Ответ №3:
Сообщение означает, что вы должны заключить в круглые скобки выражение присваивания.
Это вместо
if ( (parameters->__size) = (m_Elements.size()) )
вы должны написать
if ( ( parameters->__size = m_Elements.size() ) )
Такой подход позволяет отличить опечатку, когда вместо оператора сравнения ==
вводится оператор присваивания =
, и преднамеренное использование присваивания в условии.
Комментарии:
1. «должно быть …», как в «какой-то автор компилятора считает, что это хороший стиль для …». <g> Исходный код действителен, и его значение четко определено.