реклама на сайте
подробности

 
 
> Тернарный оператор в левой части выражения, ? : =
ViKo
сообщение Feb 10 2014, 13:40
Сообщение #1


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Читаю:
Код
  int32_t step_temp = Chan ? Step2 : Step1;

Обрабатываю...
Хочу записать обратно:
Код
(Chan ? Step2 : Step1) = step_temp;

Получаю:
error: #137: expression must be a modifiable lvalue
Как обойти?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 14)
ukpyr
сообщение Feb 10 2014, 13:45
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1 264
Регистрация: 17-06-08
Из: бандустан
Пользователь №: 38 347



if чем не угодил ?
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 10 2014, 13:51
Сообщение #3


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(ukpyr @ Feb 10 2014, 16:45) *
if чем не угодил ?

Угодил. Тогда зачем ? : и в правой части? Не вижу логики. laughing.gif
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 10 2014, 14:17
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Результатом тернарного оператора является значение одной из переменных. Значению нельзя ничего присвоить. Компилятор прав.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
SSerge
сообщение Feb 10 2014, 14:17
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



А как объявлены Step1 и Step2 ? Чтобы им что-то присвоить они действительно должны быть "modifiable lvalue".


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Feb 10 2014, 14:17
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(ViKo @ Feb 10 2014, 17:51) *
Угодил. Тогда зачем ? : и в правой части? Не вижу логики. laughing.gif

Какую логику хотите увидеть?

Цитата
int32_t step_temp = Chan ? Step2 : Step1;

Всё равно что записать
Код
if (Chan) step_temp=Step2; else step_temp=Step1;

А от этого что ожидается
Цитата
(Chan ? Step2 : Step1) = step_temp;

?

Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 10 2014, 14:23
Сообщение #7


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(_Артём_ @ Feb 10 2014, 17:17) *
Какую логику хотите увидеть?
Всё равно что записать
Код
if (Chan) step_temp=Step2; else step_temp=Step1;

А от этого что ожидается?

Элементарную логику...
Код
if (Chan) Step2 = step_temp;
else        Step1 = step_temp;
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Feb 10 2014, 14:36
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(ViKo @ Feb 10 2014, 18:23) *
Элементарную логику...
"Логика у тебя, гражданин Зубек, готов доказать, фашистская, и не к свободе она тебя ведет!"
Вам хочется странного...не иначе...
Go to the top of the page
 
+Quote Post
_pv
сообщение Feb 10 2014, 15:01
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954



*(Chan ? &Step1 : &Step2) = tmp;
только подозреваю в скомпилированном виде может выглядеть не очень красиво, по сравнению if (Chan) Step1 = tmp; else Step2 = tmp;
Go to the top of the page
 
+Quote Post
smalcom
сообщение Feb 10 2014, 15:02
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 292
Регистрация: 26-06-07
Пользователь №: 28 718



>> Элементарную логику...
такую логику си не умеет, книжку придётся прочесть.
и хорошо, что не умеет.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 10 2014, 19:53
Сообщение #11


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(_pv @ Feb 10 2014, 18:01) *
*(Chan ? &Step1 : &Step2) = tmp;
только подозреваю в скомпилированном виде может выглядеть не очень красиво, по сравнению if (Chan) Step1 = tmp; else Step2 = tmp;

Да, так получается чуть больше байтов и тактов в ассемблерном листинге.
Go to the top of the page
 
+Quote Post
ar__systems
сообщение Feb 17 2014, 16:30
Сообщение #12


self made
****

Группа: Свой
Сообщений: 855
Регистрация: 7-03-09
Из: Toronto, Canada
Пользователь №: 45 795



Цитата(ViKo @ Feb 10 2014, 14:53) *
Да, так получается чуть больше байтов и тактов в ассемблерном листинге.

Больше, по сравнению с чем? С кодом, которые не компилируется?
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Feb 17 2014, 16:40
Сообщение #13


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(ViKo @ Feb 10 2014, 22:53) *
Да, так получается чуть больше байтов и тактов в ассемблерном листинге.

ето от компилера зависит. гцц могет и убрать лишнее по самое
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 17 2014, 17:11
Сообщение #14


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(ar__systems @ Feb 17 2014, 19:30) *
Больше, по сравнению с чем? С кодом, которые не компилируется?

смешно... rolleyes.gif
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Feb 24 2014, 01:37
Сообщение #15


Профессионал
*****

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Цитата(_Артём_ @ Feb 10 2014, 18:17) *
Какую логику хотите увидеть?


Всё равно что записать
Код
if (Chan) step_temp=Step2; else step_temp=Step1;

А от этого что ожидается

?


Один нюанс. Вернее два.
1. Оператор еще возвращает значение, а if нет. То есть оператор может быть использован в правой части оператора присваивания. Иногда это полезно.
2. Используя if можно проделать множество разнообразных операций по условию, а оператор только возвращает одно либо другое значение.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 06:44
Рейтинг@Mail.ru


Страница сгенерированна за 0.0155 секунд с 7
ELECTRONIX ©2004-2016