Вопрос

Может каждый, если ... Тогда ... Else Else преобразуется в эквивалентный оператор, используя только?

Это было полезно?

Решение

Хотя любое использование я могу подумать о тройном операторе, может быть реализован как и / else, обратное не соответствует действительности; По крайней мере, не прибегая к извращенным и бессмысленным «хитростям», которые не приносят пользы с точки зрения производительности, читабельности или ремонтопригодности.

Синтаксис, если / else:

if( <boolean expression> )
    <statment>|<statment block>
else
    <statment>|<statment block>

В то время как синтаксис?: Темнарный оператор:

<boolean expression> ? <expression> : <expression> ;

Важная вещь здесь является то, что <expression> и а <statement> разные синтаксические элементы.

Очень ограниченное использование формы:

if( b ) x = y else x = z ;

может быть реализован как:

x = b ? y : x ;

Но здесь ограничение состоит в том, что такая же переменная назначается как в истинные, так и ложные положения, (и, следовательно, y и z, по меньшей мере, конвертируемым к типу X). Так что можно сказать, что любой Условное назначение Может быть реализован с помощью Ternary Operator (ведь это его основная цель).

Теперь, поскольку вызов функции является действительным выражением, вы можете обернуть истинные и ложные предложения в отдельных функциях, но чтобы сделать это просто доказать точку несколько извращено:

if( b )
    true_stuff() ;
else
    false_stuff() ;

эквивалентно:

b ? true_stuff() : false_stuff() ;

И эти функции могут содержать любой код вообще.

Итак, для преобразования более общего, если / иначе в случае? Однако даже тогда примеры Neil Butterworth будут победить этот подход с момента поведения break, continue, а также return Повлияет на поток контроля за пределами границы конструкции IF / Evel (хотя, возможно, это также являются примерами кода, которые вы хотите избежать!). Наличие goto В IF / остальном также победил бы этот подход. Отказ

Я думаю, в конце концов, даже если бы вы могли, почему вы хотите?

Другие советы

Код:

if ( flag ) {
   exit(1);
}
else {
   return 0;
}

не может быть преобразован в:

flag ? exit(1) : return 0;

Лучший пример - Это было бы внутри петли:

if ( flag ) {
   continue;
}
else {
   break;
}

не может быть преобразован в:

flag ? continue : break;

Нет.

Оба «ветви» условного выражения должны оценивать к одному и тому же типу, и этот тип не должен быть void.

Например, вы могли бы сделать это:

x > 0 ? printf("Positive!\n") : 0;

потому что printf вернуть int. Отказ (Я бы использовал это только в раунде кода гольфа, хотя; на самом деле, я только что сделал.)

Но вы не можете сделать это:

x > 0 ? exit() : 0;

потому что exit возвращается void (или, на самом деле, не возвращается вообще).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top