Подтвердить что ты не робот

Тернарный оператор без остатка в C

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

(a)? b: nothing;

что-то вроде этого. Что я не использую ни в чем?

4b9b3361

Ответ 1

Если вы используете такой тернарный оператор, предположительно, его можно заменить на:

if (a) { b; }

что намного, намного лучше. (Цель понятна, поэтому код легче читать, и потери производительности не будут.)

Однако, если вы используете тернарный оператор как выражение, т.е.

printf("%d cat%s", number_of_cats, number_of_cats != 1 ? "s" : <nothing>);

a = b*c + (d == 0 ? 1 : <nothing>);

то значение <nothing> зависит от контекста, в котором он используется. В моем первом примере <nothing> должен быть "", а во втором - 0.

Ответ 2

Недопустимое неверное выражение. Попробуйте изменить условие вместо этого.

(!a) ?: b;

Ответ 3

if-else является конструкцией потока управления, где ?: является оператором, а x ? y : z - выражением - выражение не может иметь "никакого значения", а поток управления может иметь "путь" ничего не делать ". Нет реальной эквивалентности между if-else и?: - они не являются взаимозаменяемыми при любых обстоятельствах.

Вы можете добиться желаемого эффекта в некоторых обстоятельствах, но, вероятно, менее эффективно использовать if без else. Например, эффект:

if( x )
{
    y = z ;
}

может быть достигнуто:

y = x ? z : y ;

но существует эффективное, но избыточное присваивание else y = y, когда x является ложным, который ваш компилятор может оптимизировать или оптимизировать. Таким образом, вы можете добиться эффекта, но только если вы знаете, что "текущее значение" возвращается как результат выражения ?:.

Ответ 4

Вы не можете опустить часть else. Просто используйте выражение none.

Но в этом случае часто лучше использовать if...

Ответ 5

Похоже, что этот вопрос существует некоторое время, но FWIW короткая программа на языке C, скомпилированная с GCC 4.6.3, показала следующее:

  • Не компилируется следующее: a = a ? b:;. msgstr "ошибка: ожидаемое выражение до '; токен".
  • Ниже приведен эквивалент: a = a ?: b; и a = a ? a : b;

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

Ответ 6

Я сделал это

isLeapYear(i) ? cout<< i<<endl: cout<<"" ;

Не уверен, хотя, если есть какое-то влияние на производительность.

Ответ 7

Я попытался разместить там целые числа, и он работает хорошо. Например, если вы хотите вернуть "а", если он оценил значение "Истина", вы можете записать его так:

true ? a : 1;

Ответ 8

( i == 1 ) ? puts("One") : 1 ;

If i equals 1 prints One else do nothing.

OR

( i == 1 ) ? i=2 : 0 ;
printf(" %d " , i );

Ответ 9

Попробуйте это

BOOL bIsOK = (a == 5)?TRUE:FALSE;