Вопрос
Может каждый, если ... Тогда ... 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
(или, на самом деле, не возвращается вообще).