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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
12listov
2 / 2 / 0
Регистрация: 22.07.2014
Сообщений: 203
#1

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

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

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

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

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

Зацените программу сравнения двух чисел с помощью класса - C++
#include &lt;math.h&gt; #include &lt;stdlib.h&gt; #include &lt;iostream.h&gt; class MyClass{ int x,y; public: MyClass(int x1, int y1){ x =...

Массив размером 10 на 10, заполненный квадратами чисел. Объяснить код. - C++
Создать массив размером 10 на 10 и заполнить его квадратами чисел.(первый индекс обозн. десятки, второй единицы). int main() { int...

Найти сумму двух чисел, полученных в результате сравнения чисел, полученных в результате вычисления выражений - C++
Даны действительные числа a, b, c. Найти: max(a+b, b+c) + min(a+c, b)

Подправить код. НОД двух натуральных чисел - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace std; int _tmain(int argc, _TCHAR* argv) {setlocale(LC_ALL,&quot;Russian&quot;); ...

Исправьте код(реализация сложения двух комплексных чисел) - C++
Исправьте код, в коде я реализую сложение двух комплексных чисел #include &lt;cstdlib&gt; #include &lt;iostream&gt; using namespace std; ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
КОП
361 / 280 / 86
Регистрация: 15.08.2010
Сообщений: 762
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
12listov
2 / 2 / 0
Регистрация: 22.07.2014
Сообщений: 203
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
-NEURON-
Заблокирован
24.08.2014, 20:57 #4
Цитата Сообщение от 12listov Посмотреть сообщение
А что вот это тогда за извращения? вроде тот же оператор
а это вообще чушь, не имеющая особого смысла
0
Alex5
1052 / 715 / 105
Регистрация: 12.04.2010
Сообщений: 1,818
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
КОП
361 / 280 / 86
Регистрация: 15.08.2010
Сообщений: 762
24.08.2014, 20:59 #6
Цитата Сообщение от 12listov Посмотреть сообщение
вроде тот же оператор
И работает он так же.
В первом случае условие ложное, значит возвращается второе значение - j и переменной присваивается 45, во втором наоборот.

Цитата Сообщение от -NEURON- Посмотреть сообщение
а это вообще чушь, не имеющая особого смысла
Просто мсье знает толк в извращениях. Код то без проблем выполняется, почему бы не использовать?
0
Alex5
1052 / 715 / 105
Регистрация: 12.04.2010
Сообщений: 1,818
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
AndrSlav
44 / 44 / 6
Регистрация: 20.12.2013
Сообщений: 259
24.08.2014, 21:28 #8
А зачем такая запись вообще нужна? Неужели компилятор ее оптимизирует по сравнению с if/else?
0
Евгений89
99 / 99 / 9
Регистрация: 17.04.2011
Сообщений: 554
Завершенные тесты: 2
24.08.2014, 21:34 #9
один из вариантов if - esle , такая конструкция выглядит гораздо компактнее,
быстрее написать чем обычный , особенно когда большие куски кода приходится писать.
0
КОП
361 / 280 / 86
Регистрация: 15.08.2010
Сообщений: 762
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
gru74ik
Модератор
Эксперт CЭксперт С++
4178 / 1806 / 197
Регистрация: 20.02.2013
Сообщений: 4,943
Записей в блоге: 21
24.08.2014, 21:41 #11
Цитата Сообщение от КОП Посмотреть сообщение
она просто экономит место
Не только.
0
КОП
361 / 280 / 86
Регистрация: 15.08.2010
Сообщений: 762
24.08.2014, 21:43 #12
Цитата Сообщение от gru74ik Посмотреть сообщение
Не только.
Расскажите. Я пока только так использовал.
0
gru74ik
Модератор
Эксперт CЭксперт С++
4178 / 1806 / 197
Регистрация: 20.02.2013
Сообщений: 4,943
Записей в блоге: 21
24.08.2014, 21:50 #13
Цитата Сообщение от КОП Посмотреть сообщение
Расскажите. Я пока только так использовал.
Ну вот из книжки Стивена Праты объяснение, чем ещё отличается тернарный оператор ?: от оператора выбора if else:
1
Миниатюры
Объяснить код сравнения двух чисел без If   Объяснить код сравнения двух чисел без If  
Alex5
1052 / 715 / 105
Регистрация: 12.04.2010
Сообщений: 1,818
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
gru74ik
Модератор
Эксперт CЭксперт С++
4178 / 1806 / 197
Регистрация: 20.02.2013
Сообщений: 4,943
Записей в блоге: 21
24.08.2014, 21:59 #15
С оператором выбора if else трюк с присвоением не пройдёт. А с тернарным оператором ?: проходит на ура.

Не по теме:

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

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.08.2014, 21:59
Привет! Вот еще темы с ответами:

Определить в последовательности число соседств двух чисел с разным знаком (только с циклами, без массивов) - C++
Здраствуйте! Дано натуральное число n, действительные числа q1,q2,..,qn . В последовательности q1,q2,..,qn определить число соседств двух...

Программа сравнения двух строк - C++
Написать программу сравнения двух строк на языке с++ помогите, пожалуйста

Функция сравнения двух строк - C++
Написать функцию сравнения двух строк, используя указатели на них. Прошу помочь написать код программа для заданного условия

Сравнения слов в двух строках - C++
Дано две строчные переменные, которые содержат по несколько слов, разделенных пробелами. Воспользовавшись указателями, определить, есть ли...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
24.08.2014, 21:59
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru