Как выразить три случая с условным оператором? - PullRequest
0 голосов
/ 15 декабря 2011

Можно ли выразить дела с помощью условного оператора?Например:

 if(rval==1)
     DO THIS 1;
 else if(rval==2)
     DO THIS 2;
 else if (rval ==3)
     DO THIS 3;

Ответы [ 9 ]

6 голосов
/ 15 декабря 2011

Вы не можете. То, что у вас есть, выглядит как сценарий использования для switch заявления:

switch(rval) {
    case -1: DO THIS 1; break;
    case  2: DO THIS 2; break;
    case  3: DO THIS 3; break;
    default: ERROR;
}

Редактировать Я был слишком взволнован здесь. Как указывает @ Лучиан Григоре в комментариях, вы можете сделать это (как он демонстрирует в свой ответ ). Обратите внимание, что это также хорошо определено для случаев, когда одно или оба выражения имеют тип void, как указано в §5.16 / 2 [expr.cond]:

Если второй или третий операнд имеет тип (возможно, cv-qualified) void, затем lvalue-to-rvalue (4.1), массив-указатель (4.2), и функции преобразования в указатель (4.3) выполняется на втором и третьем операндах, и один из следующих должен содержать:

- Второй или третий операнд (но не оба) является выражение броска (15.1); результат имеет тип другого и значение.

- и второй, и третий операнды имеют тип void; результат имеет тип void и является rvalue.

[Примечание: это включает случай, когда оба операнда являются бросающими выражениями. ]

5 голосов
/ 15 декабря 2011

Хотя это не обычное использование для троичного оператора, это то, как вы это делаете:

( rval == 1 ) ? (expression1) : 
( rval == 2 ) ? (expression2) : 
( rval == 3 ) ? (expression3) : (default);

Однако, ради читабельности кода, я предлагаю вам придерживаться ifзаявления.

Или еще лучше, кажется, switch было бы еще более уместным здесь.

РЕДАКТИРОВАТЬ:

Это код, который я использовал для теста:

void foo() {};
void goo() {}

int main()
{
   int x = 0;
   x == 0  ? foo() : x == 1 ? goo() : foo();
}

EDIT2:

Для всех высказываний - см. Раздел 5.16 - второй и третий операнды являются выражениями;section 5.16.2 имеет дело с выражениями типа void.

0 голосов
/ 15 декабря 2011

Существует много случаев, когда вам нужно использовать выражение (например, в макросе, расширенном там, где ожидается выражение).

Все они действительны и при правильном использовании улучшат читабельность.

Жаль, что существует такое различие между утверждениями и выражениями (оно очень неестественно и отсутствует в Algol, дедушке всех современных императивных структурных языков), но есть нестандартные расширения для использованиятакая несправедливость: http://gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html#Statement-Exprs

Итак, ответ на ваш вопрос, используя это расширение, будет следующим:

rval==1?({DO-THIS}):(?rval==2:({...}):...)

Но убедитесь, чтоПоследнее выражение DO-THIS всегда является выражением, дающим значение.

0 голосов
/ 15 декабря 2011

Как это:

    void MySwitch(int rval)
    {
             (rval==-1) ? DoThis(-1),0 :
            ((rval==2) ? DoThis(2),0 :
            ((rval==3) ? DoThis(3),0 : 0));
    }

Полный пример:

    #include <stdio.h>

    void DoThis(int j)
    {
     printf("DoThis(%d)\n", j);
    }

    void MySwitch(int rval)
    {
             (rval==-1) ? DoThis(-1),0 :
            ((rval==2) ? DoThis(2),0 :
            ((rval==3) ? DoThis(3),0 : 0));
    }

    int main(void)
    {
     printf("Calling MySwitch(-1)\n");
     MySwitch(-1);
     printf("Calling MySwitch(2)\n");
     MySwitch(2);
     printf("Calling MySwitch(3)\n");
     MySwitch(3);
     printf("Calling MySwitch(4)\n");
     MySwitch(4);
    }

Выход:

Calling MySwitch(-1)
DoThis(-1)
Calling MySwitch(2)
DoThis(2)
Calling MySwitch(3)
DoThis(3)
Calling MySwitch(4)

Конечно, это глупо. Никогда не делай этого.

0 голосов
/ 15 декабря 2011
switch ( rval ) {
  case 1 : 
    // Process for rval = 1
    ...
    break;
  case 2 : 
    // Process for rval = 2
    ...
    break;
  case 3 :
    // Process for rval = 3
    ... 
  default : 
    throw new InvalidStateException()
    // Process for all other cases.
    ...
}
0 голосов
/ 15 декабря 2011

Это выглядело бы некрасиво и не соответствовало всем стандартам кодирования, которые я видел.Тем не менее, это выглядело бы так:

int rval;
int foo = rval == -1 ? DoThis1() : (rval == 2 ? DoThis2() : DoThis3());

Я предполагаю, что rval == 3 - единственный другой возможный вариантИ если это предположение неверно, это делает весь этот беспорядок гораздо более выражением утверждения НЕ ДЕЛАЙТЕ ЭТОГО !!!

0 голосов
/ 15 декабря 2011
if(rval == 1 ? DoThis1() : (rval == 2 ? DoThis2() : (rval == 3 ? DoThis3() : /*do nothing*/)))
{
    // The if-body.
}

Но я думаю, что лучше использовать if-statment или switch-statment

0 голосов
/ 15 декабря 2011
#include "stdafx.h"


int _tmain(int argc, _TCHAR* argv[])
{
    int rval = 2;

    (rval==-1)? (printf("-1")) :( ((rval==2) ?(printf("2")) : ((rval ==3) ? (printf("3")) : (1)) ));

    return 0;
}
0 голосов
/ 15 декабря 2011
int lval = (rval==-1) ? 1 : ( (rval==2) ? 2 : 3 );
...