Форум программистов, компьютерный форум CyberForum.ru

Объяснить код сравнения двух чисел без If - C++

Восстановить пароль Регистрация
 
12listov
2 / 2 / 0
Регистрация: 22.07.2014
Сообщений: 203
24.08.2014, 20:30     Объяснить код сравнения двух чисел без If #1
C++
1
2
3
int cmp(int a, int b) {
    return (a < b ? -1 : (a > b ? 1 : 0));
}

Это сравнение двух чисел, Тут какая то скрытая конструкция IF? или как это рабоает?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.08.2014, 20:30     Объяснить код сравнения двух чисел без If
Посмотрите здесь:

Исправьте код(реализация сложения двух комплексных чисел) C++
Функция сравнения двух чисел C++
C++ Массив размером 10 на 10, заполненный квадратами чисел. Объяснить код.
Перегруженная функция сравнения двух дат C++
Определить в последовательности число соседств двух чисел с разным знаком. Только с циклами! без массивов C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
КОП
348 / 280 / 86
Регистрация: 15.08.2010
Сообщений: 755
24.08.2014, 20:33     Объяснить код сравнения двух чисел без If #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
тренарный оператор
(условие) ? (значение при true) : (при false);

с if выглядит так

C++
1
2
3
4
5
6
return (a>b) ? a : b;
//то же самое с if
if (a>b)
return a;
else
return b;
12listov
2 / 2 / 0
Регистрация: 22.07.2014
Сообщений: 203
24.08.2014, 20:47  [ТС]     Объяснить код сравнения двух чисел без If #3
Ух ты меня с такой компактности вообще порадовало... Если есть ещё что нибудь подобное давайте)

Добавлено через 4 минуты
КОП,

C++
1
2
3
4
5
6
7
8
int i;
int j;
(false ? i: j) = 45;
 
2.
int i;
int j;
(true ? i: j) = 45;
А что вот это тогда за извращения? вроде тот же оператор
-NEURON-
Заблокирован
24.08.2014, 20:57     Объяснить код сравнения двух чисел без If #4
Цитата Сообщение от 12listov Посмотреть сообщение
А что вот это тогда за извращения? вроде тот же оператор
а это вообще чушь, не имеющая особого смысла
Alex5
881 / 616 / 81
Регистрация: 12.04.2010
Сообщений: 1,552
24.08.2014, 20:59     Объяснить код сравнения двух чисел без If #5
Цитата Сообщение от 12listov Посмотреть сообщение
Если есть ещё что нибудь подобное
Вот ещё вариант:
C++
1
2
3
4
5
6
int cmp( int a, int b )
{
    if (a<b) return -1;
    else return (a>b); /* тип bool приводится к типу  int */
 
}
Добавлено через 1 минуту
C++
1
    return ( a < b   ?   -1   :   a > b );
КОП
348 / 280 / 86
Регистрация: 15.08.2010
Сообщений: 755
24.08.2014, 20:59     Объяснить код сравнения двух чисел без If #6
Цитата Сообщение от 12listov Посмотреть сообщение
вроде тот же оператор
И работает он так же.
В первом случае условие ложное, значит возвращается второе значение - j и переменной присваивается 45, во втором наоборот.

Цитата Сообщение от -NEURON- Посмотреть сообщение
а это вообще чушь, не имеющая особого смысла
Просто мсье знает толк в извращениях. Код то без проблем выполняется, почему бы не использовать?
Alex5
881 / 616 / 81
Регистрация: 12.04.2010
Сообщений: 1,552
24.08.2014, 21:05     Объяснить код сравнения двух чисел без If #7
Цитата Сообщение от 12listov Посмотреть сообщение
C++
1
(false ? i: j) = 45;
А что вот это тогда за извращения?
C++
1
2
3
4
5
6
    if( false )
        ;
    else
    {
        j = 45;
    }
AndrSlav
44 / 44 / 6
Регистрация: 20.12.2013
Сообщений: 241
24.08.2014, 21:28     Объяснить код сравнения двух чисел без If #8
А зачем такая запись вообще нужна? Неужели компилятор ее оптимизирует по сравнению с if/else?
Евгений89
 Аватар для Евгений89
99 / 99 / 9
Регистрация: 17.04.2011
Сообщений: 554
Завершенные тесты: 2
24.08.2014, 21:34     Объяснить код сравнения двух чисел без If #9
один из вариантов if - esle , такая конструкция выглядит гораздо компактнее,
быстрее написать чем обычный , особенно когда большие куски кода приходится писать.
КОП
348 / 280 / 86
Регистрация: 15.08.2010
Сообщений: 755
24.08.2014, 21:37     Объяснить код сравнения двух чисел без If #10
Цитата Сообщение от AndrSlav Посмотреть сообщение
А зачем такая запись вообще нужна?
она просто экономит место.

Ну и для примера
C++
1
cout << "Some Text " << ((a == 5) ? "a=5 " : "a!=5 ") << "other text " << ((b > c) ? "b>c" : "b<=c");
теперь попробуйте то же самое с if else.
gru74ik
Модератор
 Аватар для gru74ik
3083 / 1328 / 165
Регистрация: 20.02.2013
Сообщений: 3,785
Записей в блоге: 17
24.08.2014, 21:41     Объяснить код сравнения двух чисел без If #11
Цитата Сообщение от КОП Посмотреть сообщение
она просто экономит место
Не только.
КОП
348 / 280 / 86
Регистрация: 15.08.2010
Сообщений: 755
24.08.2014, 21:43     Объяснить код сравнения двух чисел без If #12
Цитата Сообщение от gru74ik Посмотреть сообщение
Не только.
Расскажите. Я пока только так использовал.
gru74ik
Модератор
 Аватар для gru74ik
3083 / 1328 / 165
Регистрация: 20.02.2013
Сообщений: 3,785
Записей в блоге: 17
24.08.2014, 21:50     Объяснить код сравнения двух чисел без If #13
Цитата Сообщение от КОП Посмотреть сообщение
Расскажите. Я пока только так использовал.
Ну вот из книжки Стивена Праты объяснение, чем ещё отличается тернарный оператор ?: от оператора выбора if else:
Миниатюры
Объяснить код сравнения двух чисел без If   Объяснить код сравнения двух чисел без If  
Alex5
881 / 616 / 81
Регистрация: 12.04.2010
Сообщений: 1,552
24.08.2014, 21:58     Объяснить код сравнения двух чисел без If #14
Цитата Сообщение от КОП Посмотреть сообщение
Расскажите. Я пока только так использовал.
Операция ( a ? b : c ) является выражением, возвращает значение. (Так же, как m+n, k & 1 и т.п.) (Этим Вы воспользовались в сообщ.10.) И этим отличается от if. Невозможно написать return ( if(a) {...} );
Также невозможно написать
C++
1
2
3
4
5
 // error 
// (  if(a){...}   )  = 123; 
 
 /* А вот так можно: */ ( flag & k : m )  =  456; 
// (если, конечно, допустимо присваивание переменным k и m )
gru74ik
Модератор
 Аватар для gru74ik
3083 / 1328 / 165
Регистрация: 20.02.2013
Сообщений: 3,785
Записей в блоге: 17
24.08.2014, 21:59     Объяснить код сравнения двух чисел без If #15
С оператором выбора if else трюк с присвоением не пройдёт. А с тернарным оператором ?: проходит на ура.

Не по теме:

Цитата Сообщение от Alex5 Посмотреть сообщение
Операция ( a ? b : c ) является выражением, возвращает значение.
Синхронно пишем )))

КОП
348 / 280 / 86
Регистрация: 15.08.2010
Сообщений: 755
24.08.2014, 22:01     Объяснить код сравнения двух чисел без If #16
gru74ik, Поэтому и работает
C++
1
(false ? i: j) = 45;
Я правильно понял?
Про экономию места я написал, так как видел тему о необходимости такого оператора. Суть в том, что всегда можно обойтись и без него, но с ним код более лаконичен.

Добавлено через 1 минуту
А, уже ответили пока я писал, благодарю.
gru74ik
Модератор
 Аватар для gru74ik
3083 / 1328 / 165
Регистрация: 20.02.2013
Сообщений: 3,785
Записей в блоге: 17
24.08.2014, 22:01     Объяснить код сравнения двух чисел без If #17
Цитата Сообщение от КОП Посмотреть сообщение
Я правильно понял?
Ага.
Alex5
881 / 616 / 81
Регистрация: 12.04.2010
Сообщений: 1,552
24.08.2014, 22:05     Объяснить код сравнения двух чисел без If #18

Не по теме:

Цитата Сообщение от gru74ik Посмотреть сообщение
из книжки Стивена Праты объяснение
При предварит. просмотре не видел картинок.


Впрочем здесть С.Прата не упоминает, что ( a & : b : c ) может быть L-value, находиться в левой части оператора присваивания.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.08.2014, 22:26     Объяснить код сравнения двух чисел без If
Еще ссылки по теме:

C++ программа сравнения двух строк
C++ Подправить код. НОД двух натуральных чисел
C++ Сравнения слов в двух строках

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
AndrSlav
44 / 44 / 6
Регистрация: 20.12.2013
Сообщений: 241
24.08.2014, 22:26     Объяснить код сравнения двух чисел без If #19
Цитата Сообщение от КОП Посмотреть сообщение
(false ? i: j) = 45;

Прямо символьная алгебра какая-то.
Yandex
Объявления
24.08.2014, 22:26     Объяснить код сравнения двух чисел без If
Ответ Создать тему
Опции темы

Текущее время: 04:53. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru