@Xproz
Пытаюсь постигнуть компьютерные сети

Почему компилятор ругается?

Здравствуйте. Недавно узнал о том, что есть "сокращенная версия" if...else.
Если пользователь вводит букву 'h', то переменной high присваевается значение переменной guess, иначе low = guess.
Однако компилятор пишет вот что: error: lvalue required as left operand of assignment. Но если я поставлю скобки (тоесть (high = guess) : (low = guess), то все становится нормальным. Возможно связано с тем, что : ? по приоритету выше, чем присваивание, но каким именно образом не знаю. Пожалуйста, объясните что не так
ch == 'h' ? high = guess : low = guess;
  • Вопрос задан
  • 196 просмотров
Решения вопроса 2
xorknown
@xorknown
Будут проблемы - решайте
По стандарту Си он вычисляется как logical-OR-expression ? expression : conditional-expression - это означает, что второй операнд может быть любым выражением(даже применять оператор ,), а третий операнд подчиняется логике приоритета и должен быть выше или равен по сравнению с тернарным оператором. В данном случае это вычисляется как ((ch == 'h') ? (high = guess) : low) = guess. Оператор ?: возвращает временное значение, и компилятор говорит об этом.
Ответ написан
@TheCalligrapher
Потому что написанное вами выражение не соответствует грамматике языка С вообще, т.е. является синтаксической ошибкой. Никакой из вариантов парсинга этого выражения не вписывается в грамматические правила языка. То есть ваше выражение с точки зрения языка С - это бессмысленный набор лексем.

Чтобы сделать это выражение синтаксически корректным, вы можете добавить в него скобки:

  • ch == 'h' ? (high = guess) : (low = guess)
  • (ch == 'h' ? high = guess : low) = guess
  • еще как-то


Популярный и часто приводимый ответ о том, что это выражение в С якобы интерпретируется как (ch == 'h' ? high = guess : low) = guess является грубо неверным. Еще раз: этот набор лексем не имеет вообще никакой интерпретации в грамматике языка С. Его невозможно пропарсить в принципе.

Сообщение, которые вы получили от компилятора ("error: lvalue required as left operand of assignment") говорит о том, что данный компилятор где-то "срезает углы" для экономной/унифицированной реализации грамматик сразу двух языков - С и С++. Грамматики этих языков очень похожи в общем, но сильно отличаются в деталях. Побочным эффектом такой унифицированной реализации является то, что компиляторы иногда выдают сбивающие с толку диагностические сообщения. Сообщения об ошибках не стандартизованы, т.е. формально придраться тут не к чему, но фактически полученное вами сообщение об ошибке вас нагло обманывает. Никакого "lvalue required" тут нет, а есть просто синтаксически некорректный набор лексем.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы