Название: [РЕШЕНО] Непонятка Отправлено: OKTA от Февраль 06, 2014, 14:04 Товарищи, почему следующий код не компилируется в си и ругается: error: invalid lvalue in assignment на b -=2 и b -=1
Код: b > 2 ? b -= 2 : b -= 1; Нельзя вставлять выражения? В с++ все ок. Название: Re: Непонятка Отправлено: Пантер от Февраль 06, 2014, 14:10 А разве в си есть тернарный оператор?
Название: Re: Непонятка Отправлено: OKTA от Февраль 06, 2014, 14:14 Конечно!
Название: Re: Непонятка Отправлено: Igors от Февраль 06, 2014, 14:24 Не лучше ли так
Код: b -= (b > 2) ? 2 : 1; Название: Re: Непонятка Отправлено: OKTA от Февраль 06, 2014, 14:29 Да, знаю, так будет работать, но интересно все же, почему именно первый вариант не канает. ???
Название: Re: Непонятка Отправлено: Bepec от Февраль 06, 2014, 14:36 А если скобочки поставить?
Код: (b > 2) ? (b -= 2) : (b -= 1); Название: Re: Непонятка Отправлено: OKTA от Февраль 06, 2014, 14:39 ну тооооооочно ;D ;D ;D
Другой приоритет получается? Название: Re: Непонятка Отправлено: Bepec от Февраль 06, 2014, 14:43 Да, именно приоритет.
http://ru.cppreference.com/w/cpp/language/operator_precedence - приоритет в данном случае справа налево идёт. Название: Re: Непонятка Отправлено: OKTA от Февраль 06, 2014, 15:06 Спасибо всем! Разобрался! Получается, без скобок за счет приоритета интерпретировалось так:
Код: (b > 2 ? b -= 2 : b ) -= 1; И в итоге достаточно записать так: Код: b > 2 ? b -= 2 : (b -= 1); Название: Re: Непонятка Отправлено: GreatSnake от Февраль 06, 2014, 15:13 И зачем ???
Лень вставить "if" и "else" ??? Название: Re: Непонятка Отправлено: Пантер от Февраль 06, 2014, 15:15 И зачем ??? Тернарный оператор легче воспринимать, да и запись с ним компактнее.Лень вставить "if" и "else" ??? Название: Re: Непонятка Отправлено: GreatSnake от Февраль 06, 2014, 15:19 Тернарный оператор легче воспринимать, да и запись с ним компактнее. Согласен, но не в этом случае.Почему тогда не писать так? Код
Название: Re: Непонятка Отправлено: OKTA от Февраль 06, 2014, 15:19 А так уже хуже воспринимается написанное)))
Название: Re: Непонятка Отправлено: GreatSnake от Февраль 06, 2014, 15:22 А так уже хуже воспринимается написанное))) Не думаю, что такое же мнение будет у человека, который после тебя будет поддерживать этот код)Название: Re: Непонятка Отправлено: OKTA от Февраль 06, 2014, 15:24 Ну почему, запись типа
Код: b > 2 ? b -= 2 : b -= 1; Название: Re: Непонятка Отправлено: OKTA от Февраль 06, 2014, 15:26 да, и кстати все равно непонятно, почему без скобок в с++ все работает правильно в отличии от с ;D
Название: Re: Непонятка Отправлено: OKTA от Февраль 06, 2014, 15:48 А, вроде понятно, в си тернарное условие имеет приоритет выше, чем присваивание, а в с++ одинаковый приоритет.
Название: Re: Непонятка Отправлено: Igors от Февраль 06, 2014, 18:23 А Вас не смущает что b -= записано дважды? Может лучше с этого начать "борьбу за чистоту рядов"? :)
Название: Re: Непонятка Отправлено: OKTA от Февраль 07, 2014, 09:11 Это просто частный пример!) на их месте же могут быть и любые другие выражения)
Название: Re: Непонятка Отправлено: _Bers от Февраль 07, 2014, 16:50 А Вас не смущает что b -= записано дважды? Может лучше с этого начать "борьбу за чистоту рядов"? :) Ну и что? Почему это может кого-то смущать? Название: Re: Непонятка Отправлено: Bepec от Февраль 07, 2014, 17:55 Потому что кому-то на это безразлично, а у кого-то внутри аж подвывает от осознания того, что оператор используется два раза там, где можно только раз.
PS здравые предложения и объяснения бесполезны, так же как и доводы к читабельности кода :D Название: Re: Непонятка Отправлено: BuRn от Февраль 11, 2014, 18:15 Ну почему, запись типа Считаю запись:b -= ( b > 2 ? 2 : 1 ); более компактной понятной и удобнойКод: b > 2 ? b -= 2 : b -= 1; Название: Re: [РЕШЕНО] Непонятка Отправлено: Bepec от Февраль 11, 2014, 18:47 А я вижу здесь два магических числа :D Что тоже плохо. У каждого своё мнение :)
|