Russian Qt Forum

Программирование => С/C++ => Тема начата: OKTA от Февраль 06, 2014, 14:04



Название: [РЕШЕНО] Непонятка
Отправлено: 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;
// return b;


Название: 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; 
что в свою очередь приводило бы как раз к invalid lvalue.

И в итоге достаточно записать так:

Код:
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
Тернарный оператор легче воспринимать, да и запись с ним компактнее.
Согласен, но не в этом случае.
Почему тогда не писать так?
Код
C
b -= ( b > 2 ? 2 : 1 );


Название: Re: Непонятка
Отправлено: OKTA от Февраль 06, 2014, 15:19
А так уже хуже воспринимается написанное)))


Название: Re: Непонятка
Отправлено: GreatSnake от Февраль 06, 2014, 15:22
А так уже хуже воспринимается написанное)))
Не думаю, что такое же мнение будет у человека, который после тебя будет поддерживать этот код)


Название: Re: Непонятка
Отправлено: OKTA от Февраль 06, 2014, 15:24
Ну почему, запись типа
Код:
b > 2 ? b -= 2 : b -= 1;
сразу дает понять, что условие у нас b > 2 и в зависимости от него выполняется или первое или второе - как раз чистое отображение if-else  :)


Название: 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 > 2 ? b -= 2 : b -= 1;
сразу дает понять, что условие у нас b > 2 и в зависимости от него выполняется или первое или второе - как раз чистое отображение if-else  :)
Считаю запись:b -= ( b > 2 ? 2 : 1 ); более компактной понятной и удобной


Название: Re: [РЕШЕНО] Непонятка
Отправлено: Bepec от Февраль 11, 2014, 18:47
А я вижу здесь два магических числа :D Что тоже плохо. У каждого своё мнение :)