Тернарный оператор Java / C - PullRequest
       3

Тернарный оператор Java / C

0 голосов
/ 14 сентября 2011

Я хочу преобразовать код из условия if в троичное условие. Сначала мне удалось преобразовать одно условие, например:

    int minutes=59,hours=23;
// 1) if condition
if (minutes<59)
    minutes++;
else
    minutes=0;

// 2) ternary condition
minutes = (minutes < 59) ? minutes+1  :  0;

Теперь проблема в том, что у меня болееотредактируйте его, например:

    int minutes=59,hours=23;
// if condition
if (minutes<59)
    minutes++;
else
{
    minutes = 0;
    if (hours<23)
        hours++;
    else 
        hours=0;
}

что вы думаете о тройном состоянии?спасибо:)

Ответы [ 5 ]

8 голосов
/ 14 сентября 2011

Что я думаю об этом, так это то, что вы не должны этого делать.

Но если вы действительно хотите, вы можете написать это:

minutes = (minutes < 59)
        ? (minutes+1)
        : ((hours = (hours < 23) ? (hours+1) : 0), 0);

Но не надо.

3 голосов
/ 14 сентября 2011

Множественные тройные состояния болезненны! Только не ...

Не уверен, что вы пытаетесь сделать, но если вам нужно округлить даты, вы, возможно, захотите взглянуть на DateUtils, например.

3 голосов
/ 14 сентября 2011

" Тогда не делайте этого. "

Неверно или даже возможно преобразовать все конструкции if-then в ?: конструкций на Java или C. (Это возможно на функциональных языках, но даже тогда это не всегда рекомендуется.)

Для того, что вы пытаетесь сделать,Я бы написал

minutes++;
if (minutes == 60) { minutes = 0; hours++; }
if (hours == 24)   { hours = 0;   days++;  }
// etcetera
2 голосов
/ 14 сентября 2011

Я думаю, что мой предпочтительный способ сделать это будет

minutes = minutes == 59 ? 0 : minutes + 1;
if (minutes == 0) {
    hours = hours == 23 ? 0 : hours + 1;
}

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

1 голос
/ 14 сентября 2011

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

Вы можете использовать оператор запятой для объединения выражений (значение будет тем из последнего). Ваш пример может быть переписан следующим образом:

minutes = (minutes < 59) ? 
    minutes + 1 : 
    ( hours < 23 ? 
        (hours++, 0) : 
        (hours = 0) );

Хотя в приведенном вами примере использование оператора модуля для hours может упростить его следующим образом:

hours = (minutes = (minutes + 1) % 60) ? hours : ((hours + 1) % 24);

.. поскольку результатом присваивания является значение, назначенное в C, и вы можете использовать его в качестве тестового выражения.

Это работает для C ... не уверен насчет Java.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...