Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.55/29: Рейтинг темы: голосов - 29, средняя оценка - 4.55
3 / 3 / 0
Регистрация: 22.07.2014
Сообщений: 209
1

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

24.08.2014, 20:30. Показов 5838. Ответов 18
Метки нет (Все метки)

C++
1
2
3
int cmp(int a, int b) {
    return (a < b ? -1 : (a > b ? 1 : 0));
}

Это сравнение двух чисел, Тут какая то скрытая конструкция IF? или как это рабоает?
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.08.2014, 20:30
Ответы с готовыми решениями:

Вывести большее из двух чисел без использования операций сравнения
Вот столкнулся с интересной задачкой по программированию и пытаюсь ее решить. Суть задачи: на вход...

Код сравнения двух разных столбцов
нужна помощь к коде есть сравнения двух столбцов на разных столбцов но ну меня ошибка 9 помогите...

Сравнения двух чисел
Подскажите как реализовать сравнение двух чисел.Например если А&gt;=B то переход на метку1. Нашла...

Функция сравнения двух чисел
Проверьте кто-нибудь код пожалуйста. Задача : Написать программу, выводящую на экран результат...

18
1118 / 789 / 219
Регистрация: 15.08.2010
Сообщений: 2,171
24.08.2014, 20:33 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;
0
3 / 3 / 0
Регистрация: 22.07.2014
Сообщений: 209
24.08.2014, 20:47  [ТС] 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;
А что вот это тогда за извращения? вроде тот же оператор
0
Заблокирован
24.08.2014, 20:57 4
Цитата Сообщение от 12listov Посмотреть сообщение
А что вот это тогда за извращения? вроде тот же оператор
а это вообще чушь, не имеющая особого смысла
0
1129 / 788 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
24.08.2014, 20:59 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 );
0
1118 / 789 / 219
Регистрация: 15.08.2010
Сообщений: 2,171
24.08.2014, 20:59 6
Цитата Сообщение от 12listov Посмотреть сообщение
вроде тот же оператор
И работает он так же.
В первом случае условие ложное, значит возвращается второе значение - j и переменной присваивается 45, во втором наоборот.

Цитата Сообщение от -NEURON- Посмотреть сообщение
а это вообще чушь, не имеющая особого смысла
Просто мсье знает толк в извращениях. Код то без проблем выполняется, почему бы не использовать?
0
1129 / 788 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
24.08.2014, 21:05 7
Цитата Сообщение от 12listov Посмотреть сообщение
C++
1
(false ? i: j) = 45;
А что вот это тогда за извращения?
C++
1
2
3
4
5
6
    if( false )
        ;
    else
    {
        j = 45;
    }
0
68 / 56 / 14
Регистрация: 20.12.2013
Сообщений: 542
24.08.2014, 21:28 8
А зачем такая запись вообще нужна? Неужели компилятор ее оптимизирует по сравнению с if/else?
0
100 / 100 / 39
Регистрация: 17.04.2011
Сообщений: 554
24.08.2014, 21:34 9
один из вариантов if - esle , такая конструкция выглядит гораздо компактнее,
быстрее написать чем обычный , особенно когда большие куски кода приходится писать.
0
1118 / 789 / 219
Регистрация: 15.08.2010
Сообщений: 2,171
24.08.2014, 21:37 10
Цитата Сообщение от AndrSlav Посмотреть сообщение
А зачем такая запись вообще нужна?
она просто экономит место.

Ну и для примера
C++
1
cout << "Some Text " << ((a == 5) ? "a=5 " : "a!=5 ") << "other text " << ((b > c) ? "b>c" : "b<=c");
теперь попробуйте то же самое с if else.
0
Эксперт CЭксперт С++
5072 / 2257 / 331
Регистрация: 20.02.2013
Сообщений: 5,595
Записей в блоге: 19
24.08.2014, 21:41 11
Цитата Сообщение от КОП Посмотреть сообщение
она просто экономит место
Не только.
0
1118 / 789 / 219
Регистрация: 15.08.2010
Сообщений: 2,171
24.08.2014, 21:43 12
Цитата Сообщение от gru74ik Посмотреть сообщение
Не только.
Расскажите. Я пока только так использовал.
0
Эксперт CЭксперт С++
5072 / 2257 / 331
Регистрация: 20.02.2013
Сообщений: 5,595
Записей в блоге: 19
24.08.2014, 21:50 13
Цитата Сообщение от КОП Посмотреть сообщение
Расскажите. Я пока только так использовал.
Ну вот из книжки Стивена Праты объяснение, чем ещё отличается тернарный оператор ?: от оператора выбора if else:
Миниатюры
Объяснить код сравнения двух чисел без If   Объяснить код сравнения двух чисел без If  
1
1129 / 788 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
24.08.2014, 21:58 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 )
1
Эксперт CЭксперт С++
5072 / 2257 / 331
Регистрация: 20.02.2013
Сообщений: 5,595
Записей в блоге: 19
24.08.2014, 21:59 15
С оператором выбора if else трюк с присвоением не пройдёт. А с тернарным оператором ?: проходит на ура.

Не по теме:

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

0
1118 / 789 / 219
Регистрация: 15.08.2010
Сообщений: 2,171
24.08.2014, 22:01 16
gru74ik, Поэтому и работает
C++
1
(false ? i: j) = 45;
Я правильно понял?
Про экономию места я написал, так как видел тему о необходимости такого оператора. Суть в том, что всегда можно обойтись и без него, но с ним код более лаконичен.

Добавлено через 1 минуту
А, уже ответили пока я писал, благодарю.
0
Эксперт CЭксперт С++
5072 / 2257 / 331
Регистрация: 20.02.2013
Сообщений: 5,595
Записей в блоге: 19
24.08.2014, 22:01 17
Цитата Сообщение от КОП Посмотреть сообщение
Я правильно понял?
Ага.
0
1129 / 788 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
24.08.2014, 22:05 18

Не по теме:

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


Впрочем здесть С.Прата не упоминает, что ( a & : b : c ) может быть L-value, находиться в левой части оператора присваивания.
0
68 / 56 / 14
Регистрация: 20.12.2013
Сообщений: 542
24.08.2014, 22:26 19
Цитата Сообщение от КОП Посмотреть сообщение
(false ? i: j) = 45;

Прямо символьная алгебра какая-то.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.08.2014, 22:26

Написать логическую функцию сравнения двух дат, исправить код
Написать логическую функцию сравнения 2-х дат, каждая из которых задана тремя числами: числом,...

Напишите функцию сравнения двух чисел
Напишите функцию, которая принимает два целых числа, и определяет большее из них.

Схема сравнения двух четырехразрядных чисел
вот схема для сравнения больше. помогите мне что нужно изменить для схемы меньше

Ошибка в программе сравнения двух чисел
Проблема в сравнении двух чисел-вывод в обоих случаях один OS Linux Ubuntu x86 64 section...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru