Есть ли более простой способ сделать: если (num1> num2 && num1> num3), для большего списка переменных для сравнения? - PullRequest
0 голосов
/ 14 января 2019

Я хотел бы знать (просто для того, чтобы знать), есть ли способ выполнить следующие инструкции с более простым кодом: (C ++)

if(a > b && a > c && a > d)

возможно ли заменить его на что-то вроде этого:

 if(a > b, c, d)

Ответы [ 3 ]

0 голосов
/ 14 января 2019

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

int i = 0;
while ((a < array[i]) && (i < kMaxElements))
{
    i++;
}

В конце i будет либо равен kMaxElements, либо будет индексом предмета, равным или превышающим a.

Еще лучше, вы можете выполнить двоичный поиск в массиве, чтобы найти определенный элемент. В C ++ есть специальные алгоритмы для этого в <algorithm> tools . См., В частности, binary_search(), lower_bound() и upper_bound().

0 голосов
/ 14 января 2019

Когда вы набираете код if(a > b, c, d), вы используете оператор запятой (и не хотите).

Я не понимаю, что именно вы спрашиваете. Во всех случаях компьютеру приходится (иногда) делать три сравнения. Почему ты не можешь записать их все по буквам?

Возможно, вы могли бы использовать причудливые препроцессоры трюки, но в вашем конкретном случае вы не должны.

Конечно, тест if может быть длинным выражением, которое занимает несколько строк. Допустимо и обычно писать что-то вроде

if (a > b
    && a > c
    && a > d
    && somelongandcomplexcondition(a,b,c)
    && a*a > 34)

Обратите внимание, что Ответ Руслана вычисляет макс. Возможно, вы не захотите, особенно если b и c являются длинными и сложными подвыражениями с побочными эффектами.

Подумайте, например, о тесте вроде if (c > 1 && a > 1 && a > b && a > b/c); Вы полагаетесь на ленивую оценку «а затем» &&, чтобы избежать деления на ноль.

Если вы хотите узнать больше о C11 , см. Справочник C и обратитесь к его стандартному n1570 .

Если вы хотите узнать больше о C ++ 11 , см. Справочник C ++ и обратитесь к его стандарту n3337 (или другому, более молодому стандарту) как C ++ 17 ).

И C, и C ++ точно определяют, каким может быть оператор if.

Не путайте C и C ++, они разные языки программирования, и оба они указаны в их стандартной спецификации. Некоторые компиляторы, в частности GCC , предоставляют расширения для них. Вы несете ответственность за решение использовать специфичные для компилятора расширения или придерживаться языкового стандарта (и надеяться, что ваш код будет компилироваться многими компиляторами, соблюдающими этот стандарт).

В некоторых особых случаях ваши тесты (или ваш код на C или C ++) настолько длинные и повторяющиеся, что вы могли бы рассмотреть некоторый подход метапрограммирования : затем вы напишите какой-нибудь скрипт (или некоторую метапрограмму) испускать C (или C ++) код в файле (и позже вы можете скомпилировать этот сгенерированный файл или #include его и т. д.). Есть несколько примеров генераторов кода на C или C ++ (например, bison , SWIG и т. Д.), Которые могут вас вдохновить. Вы также можете использовать какой-нибудь универсальный препроцессор, такой как GPP или m4, или чтобы ваш скрипт на awk или python (или ваша другая программа на C ++) генерировал какой-то файл на C или C ++ и т. Д. Конечно, вы настроите свой автоматизация сборки (например, ваш Makefile) для таких особых случаев.

0 голосов
/ 14 января 2019

Используйте std::max(std::initializer_list<T>) из заголовка <algorithm> следующим образом:

#include <iostream>
#include <algorithm>

int main()
{
    if(4 > std::max({2,3,6}))
        std::cout << "greater\n";
    else
        std::cout << "not greater\n";
}
...