2012-06-14 3 views
3
#include <iostream> 
using namespace std; 
int main() 
{ 
    int a, b, c, max; 
    cout<<"a="; cin>>a; 
    cout<<"b="; cin>>b; 
    cout<<"c="; cin>>c; 
    a>b?(max=a, a=b, b=max):a; 
    b>c?(max=b, b=c, c=max):a; 
    a>b?(max=a, a=b, b=max):a; 
    cout<<a<<" "<<b<<" "<<c; 
} 

Это код, в котором вы можете ввести 3 случайных числа, и это приведет их в порядок. Однако я не понимаю эту часть:Невозможно понять выражение запятой

a>b?(max=a, a=b, b=max):a; 
b>c?(max=b, b=c, c=max):a; 
a>b?(max=a, a=b, b=max):a; 

Как это работает и почему?

Скажем, a = 6, b = 54 и c = 12.

  1. a> b? (Max = a, a = b, b = max): a; < - устанавливает максимум до 6, затем от a до 54, затем 54 = макс. затем сравнивает 6 - 54, что является ложным, и записывает (6) в качестве первого числа?

  2. b> c? (Max = b, b = c, c = max): a; < - устанавливает максимальное значение до 54, b = 12, 12 = макс. затем сравнивает 54 к 12, что верно в нашем случае и записывает c = 12 как второе число?

  3. a> b? (Max = a, a = b, b = max): a; < - устанавливает максимум до 6, a = 54, 54 = макс. затем сравнивает 6 - 54, что является ложным, и снова пишет 6, wtf?

Сама программа работает правильно. Я просто не понимаю, как работает алгоритм.

+13

Это гротескный код. Лучше просто игнорировать его. –

+0

"*' a> b? (Max = a, a = b, b = max): a; '<- устанавливает max до 6 *" Нет, он ничего не делает, потому что b> a .. . »тогда 54 = max *« Что? Как вы можете присвоить значение литералу? – ildjarn

+0

Центральная идея: 'a> b? (Max = a, a = b, b = max): a;' ничего не делает, если 'a <= b' – damned

ответ

4

Это:

cond ? A : B 

является примерно эквивалентно следующему:

if (cond) { 
    A; 
} else { 
    B; 
} 

Это:

(X, Y, Z) 

является примерно эквивалентно следующему:

X; 
Y; 
Z; 

т. Е. Каждое выражение оценивается полностью, в свою очередь.

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

+0

Это не говорит ему, что он делает, он повторяет, что на cplusplus.com – trumpetlicks

+0

@trumpetlicks: Очевидно, из вопроса, что OP незнакомо с тем, как работают эти операторы, что не позволяет ему понять, как работает код. Мой ответ объясняет, как работают эти операторы. –

2

Весь код делает злоупотребление способностью оператора-запятой делать несколько вещей в одном, чтобы менять значения в одном выражении.

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

Это примерно то же самое, как это:

if (a > b) 
    swap (a, b); //b is max(a,b) 
if (b > c) 
    swap (b, c); //c is max(max(a,b),c), which is largest 
if (a > b) 
    swap (a, b); //b is max (a, b), so numbers are in order smallest to largest 
0

Ну, по сути я это то, что происходит.

a>b?(max=a, a=b, b=max):a; 

первая секция представляет собой обычное сравнение в моде третичного, если заявление, поэтому в основном он проверяет a>b, то ? просто равно первые скобки набора, так что, если это правда, он оценивает первый раздел, иначе код после : будет точно таким же, как и тот, который будет оцениваться. (max=a, a=b, b=max) в основном оценивает каждый элемент по очереди, поэтому сначала max установлен в a, затем a = b и, наконец, b = max; То же самое для двух других строк.

Вы можете прочитать здесь: http://www.cplusplus.com/doc/tutorial/operators/

Надеется, что это помогло.

2
a>b?(max=a, a=b, b=max):a 

Окончательный вариант «: a» действительно ничего не делает, он мог бы так же легко быть «: 0». Это, по сути, утверждение, которое должно выполняться, если «a> b» является ложным. но поскольку a не привязан ни к чему, он ничего не делает. поэтому в этом случае

if(a > b){ 
    max = a; 
    a = b; 
    b = max; 
} 

Он использует переменную max для замены a и b; Алгоритм SAME используется для следующих двух строк. Таким образом, по существу

if a > b then swap them 
now if b (which could hold a) > c then swap them 
now if a (which could hold the older b) > b(which could hold the oldest c) then swap 
Смежные вопросы