Перейти к содержанию
    

Тернарный оператор в левой части выражения

Читаю:

  int32_t step_temp = Chan ? Step2 : Step1;

Обрабатываю...

Хочу записать обратно:

 (Chan ? Step2 : Step1) = step_temp;

Получаю:

error: #137: expression must be a modifiable lvalue

Как обойти?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

if чем не угодил ?

Угодил. Тогда зачем ? : и в правой части? Не вижу логики. :laughing:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Угодил. Тогда зачем ? : и в правой части? Не вижу логики. :laughing:

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

 

int32_t step_temp = Chan ? Step2 : Step1;

Всё равно что записать

if (Chan) step_temp=Step2; else step_temp=Step1;

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

(Chan ? Step2 : Step1) = step_temp;

?

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Всё равно что записать

if (Chan) step_temp=Step2; else step_temp=Step1;

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

Элементарную логику...

if (Chan) Step2 = step_temp;
else        Step1 = step_temp;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Элементарную логику...
"Логика у тебя, гражданин Зубек, готов доказать, фашистская, и не к свободе она тебя ведет!"

Вам хочется странного...не иначе...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

*(Chan ? &Step1 : &Step2) = tmp;

только подозреваю в скомпилированном виде может выглядеть не очень красиво, по сравнению if (Chan) Step1 = tmp; else Step2 = tmp;

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

>> Элементарную логику...

такую логику си не умеет, книжку придётся прочесть.

и хорошо, что не умеет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

*(Chan ? &Step1 : &Step2) = tmp;

только подозреваю в скомпилированном виде может выглядеть не очень красиво, по сравнению if (Chan) Step1 = tmp; else Step2 = tmp;

Да, так получается чуть больше байтов и тактов в ассемблерном листинге.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, так получается чуть больше байтов и тактов в ассемблерном листинге.

Больше, по сравнению с чем? С кодом, которые не компилируется?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, так получается чуть больше байтов и тактов в ассемблерном листинге.

ето от компилера зависит. гцц могет и убрать лишнее по самое

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Больше, по сравнению с чем? С кодом, которые не компилируется?

смешно... :rolleyes:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

 

Всё равно что записать

if (Chan) step_temp=Step2; else step_temp=Step1;

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

 

?

 

Один нюанс. Вернее два.

1. Оператор еще возвращает значение, а if нет. То есть оператор может быть использован в правой части оператора присваивания. Иногда это полезно.

2. Используя if можно проделать множество разнообразных операций по условию, а оператор только возвращает одно либо другое значение.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...