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

    @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" тут нет, а есть просто синтаксически некорректный набор лексем.
    Ответ написан
    5 комментариев