Как мне исправить ошибку Werror= круглые скобки (предлагать круглые скобки вокруг присваивания)?

#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> Исходный код действителен, и его значение четко определено.