Russian Qt Forum
Ноябрь 18, 2024, 06:30 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: [РЕШЕНО] Непонятка  (Прочитано 9087 раз)
OKTA
Гость
« : Февраль 06, 2014, 14:04 »

Товарищи, почему следующий код не компилируется в си и ругается: error: invalid lvalue in assignment на b -=2 и b -=1

Код:
b > 2 ? b -= 2 : b -= 1;

Нельзя вставлять выражения? В с++ все ок.
« Последнее редактирование: Февраль 09, 2014, 11:09 от OKTA » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Февраль 06, 2014, 14:10 »

А разве в си есть тернарный оператор?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
OKTA
Гость
« Ответ #2 : Февраль 06, 2014, 14:14 »

Конечно!
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Февраль 06, 2014, 14:24 »

Не лучше ли так

Код:
b -= (b > 2) ? 2 : 1;
// return b;
Записан
OKTA
Гость
« Ответ #4 : Февраль 06, 2014, 14:29 »

Да, знаю, так будет работать, но интересно все же, почему именно первый вариант не канает.  Непонимающий
Записан
Bepec
Гость
« Ответ #5 : Февраль 06, 2014, 14:36 »

А если скобочки поставить?
Код:
(b > 2) ? (b -= 2) : (b -= 1);
Записан
OKTA
Гость
« Ответ #6 : Февраль 06, 2014, 14:39 »

ну тооооооочно  Смеющийся Смеющийся Смеющийся
Другой приоритет получается?
Записан
Bepec
Гость
« Ответ #7 : Февраль 06, 2014, 14:43 »

Да, именно приоритет.

http://ru.cppreference.com/w/cpp/language/operator_precedence - приоритет в данном случае справа налево идёт.
Записан
OKTA
Гость
« Ответ #8 : Февраль 06, 2014, 15:06 »

Спасибо всем! Разобрался! Получается, без скобок за счет приоритета интерпретировалось так:

Код:
(b > 2 ? b -= 2 : b ) -= 1; 
что в свою очередь приводило бы как раз к invalid lvalue.

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

Код:
b > 2 ? b -= 2 : (b -= 1);
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #9 : Февраль 06, 2014, 15:13 »

И зачем Непонимающий
Лень вставить "if" и "else" Непонимающий
Записан

Qt 5.11/4.8.7 (X11/Win)
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #10 : Февраль 06, 2014, 15:15 »

И зачем Непонимающий
Лень вставить "if" и "else" Непонимающий
Тернарный оператор легче воспринимать, да и запись с ним компактнее.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #11 : Февраль 06, 2014, 15:19 »

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

Qt 5.11/4.8.7 (X11/Win)
OKTA
Гость
« Ответ #12 : Февраль 06, 2014, 15:19 »

А так уже хуже воспринимается написанное)))
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #13 : Февраль 06, 2014, 15:22 »

А так уже хуже воспринимается написанное)))
Не думаю, что такое же мнение будет у человека, который после тебя будет поддерживать этот код)
Записан

Qt 5.11/4.8.7 (X11/Win)
OKTA
Гость
« Ответ #14 : Февраль 06, 2014, 15:24 »

Ну почему, запись типа
Код:
b > 2 ? b -= 2 : b -= 1;
сразу дает понять, что условие у нас b > 2 и в зависимости от него выполняется или первое или второе - как раз чистое отображение if-else  Улыбающийся
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.128 секунд. Запросов: 23.