Условное выполнение без If

Тема в разделе "Arduino & Shields", создана пользователем DrProg, 24 апр 2015.

  1. DrProg

    DrProg Вечный нерд

    Терзают смутные сомнения что это возможно, но не могу вспомнить.

    Например есть переменные:
    boolean lr = true;
    int val = 0;
    Как написать одной строкой чтобы val++ при lr=true и val-- при lr=false? Можно через if, но хочется бОльшей изящности.
     
  2. Megakoteyka

    Megakoteyka Оракул Модератор

    val += lr ? 1 : -1;
     
  3. DrProg

    DrProg Вечный нерд

    Разве в таком случае будет не +1:0 ?
     
  4. Megakoteyka

    Megakoteyka Оракул Модератор

    Почему так должно быть? Выражение в правой части (после знака "=") принимает значение 1 либо -1. Результат прибавляется к переменной.
     
  5. Unixon

    Unixon Оракул Модератор

    Все равно это завуалированное условие.
    Правильно так:
    Код (Text):

     bool x;
     int y;
     y += x-!x;
     
     
    iglooshtosser и Tomasina нравится это.
  6. DrProg

    DrProg Вечный нерд

    Вот второй вариант верен. Спасибо.

    В первом будет прибавлять либо 1, либо 0.

    И еще вопрос: как одной командой переключить булевую переменную? Только х = !х?
     
    Последнее редактирование: 24 апр 2015
  7. Megakoteyka

    Megakoteyka Оракул Модератор

    С чего Вы это взяли? Проверьте.
     
  8. DrProg

    DrProg Вечный нерд

    Я проверил, либо прибавляет (при true), либо не прибавляет (false). lr же принимает 1 или 0, а не 1 или -1.
     
  9. Megakoteyka

    Megakoteyka Оракул Модератор

    Вы написали "val += lr;" вместо "val += lr ? 1 : -1;" ?
     
  10. Megakoteyka

    Megakoteyka Оракул Модератор

    В Си тернарная операция имеет следующий синтаксис:
    o1 ? o2 : o3
    Сначала вычисляется именно его значение. Оно сравнивается с нулём и, если оно не равно нулю, вычисляется и возвращается o2, в случае равенства — o3.
    В следующем примере вычисляется минимальное из чисел a и b:
    min = (a < b) ? a : b;
    https://ru.wikipedia.org/wiki/Тернарная_условная_операция#.D0.A1.D0.B8
     
  11. DrProg

    DrProg Вечный нерд

    Это что за недокументированный оператор такой? Где почитать?

    Опередили! Спасибо большое, наверное этот способ мне смутно и мерещился! Что то такое я и видел.

    Но Unixon тоже прав, по сути тернарная операция это тоже If, только более короткий.
     
    Последнее редактирование: 24 апр 2015
  12. Megakoteyka

    Megakoteyka Оракул Модератор

  13. Unixon

    Unixon Оракул Модератор

    Суть в том, что это вычисление без ветвления.
     
  14. DrProg

    DrProg Вечный нерд

    Теоретически оно быстрее работает и занимает меньше места в готовом коде.
     
  15. Megakoteyka

    Megakoteyka Оракул Модератор

    А на практике вот так:
    472.PNG 474.PNG
     
  16. Unixon

    Unixon Оракул Модератор

    На GPU точно быстрее :)
     
  17. DrProg

    DrProg Вечный нерд

    Забавно! А скорость выполнения? Прокрутить бы в цикле раз тысячу то и другое и сравнить.

    И заменить стандартным:
    if (x) val++; else val--;
    будет разница?

    Жаль уже все выключил, лежу с планшетом. )
     
  18. Megakoteyka

    Megakoteyka Оракул Модератор

    Не надо крутить и сравнивать. Чем меньше инструкций, тем выше скорость.
     
  19. Megakoteyka

    Megakoteyka Оракул Модератор

    А ПЛИС вообще всех сделает :)
     
  20. DrProg

    DrProg Вечный нерд

    Я все же попробую на досуге проверю все три варианта на соотношение размер/скорость. Хотя бы для того, чтобы знать изящество это только красота или еще и функционал.