Что значит '?' делать в C ++?

80
int qempty()
{
    return (f == r ? 1 : 0);
}

Что означает " ? " В приведенном выше фрагменте ? Чем его можно заменить?

Thaier Alkhateeb
источник
22
В этом конкретном случае, конечно, вы можете просто заменить его на return f == r;
Eclipse,
6
@Eclipse: я бы не стал полагаться на неявное преобразование bool-> int, если бы смог этого избежать.
Дэниел Даранас,
2
@DanielDaranas, почему бы и нет? (Это своего рода вопрос для новичков - объяснение ваших комментариев для новичков было бы очень полезно и признательно.)
Майкл Хоффманн
4
@MichaelHoffmann Поведение неявного преобразования в этом случае хорошо определено, поэтому его использование совершенно правильно; см. этот ответ для ссылки на стандарт. Лично я избегаю использования неявных преобразований типов, потому что считаю, что без них код более читабелен и удобен в обслуживании и менее подвержен ошибкам. Подробнее об этом я писал в этом блоге .
Даниэль Даранас,

Ответы:

135

Обычно его называют условным оператором , и когда он используется следующим образом:

condition ? result_if_true : result_if_false

... если conditionвычисляется значение true, выражение оценивается как result_if_true, иначе оно оценивается как result_if_false.

Это синтаксический сахар , и в этом случае его можно заменить на

int qempty()
{ 
  if(f == r)
  {
      return 1;
  } 
  else 
  {
      return 0;
  }
}

Примечание. Некоторые люди называют ?:его « тернарным оператором », потому что это единственный тернарный оператор (т. Е. Оператор, который принимает три аргумента) на языке, который они используют.

Даниэль ЛеШеминант
источник
4
В обычном коде это синтаксический сахар, но он позволяет выполнять условную инициализацию в списке инициализации конструктора.
JohnMcG
Foo (Bar * y) pMember (y == NULL? NULL: y-> pMember) - Здесь мы инициализируем pMember значением pMember y или NULL, если его нет. Невозможно поместить if-else в инициализацию конструктора, поэтому тернарный оператор делает это возможным.
JohnMcG
@JohnMcG: Ну, в C ++ 11 вы могли бы рассмотреть a? b : cсинтаксический сахар для [&]() -> Type { if (a) return b; else return c; }().
celtschk 07
1
Возможно, но вопрос, ответ и комментарий были написаны в 2009 году.
JohnMcG
15

Это тернарный оператор, в основном это встроенный оператор if

x ? y : z

работает как

if(x) y else z

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

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

Ричард
источник
4
Стоит знать, что перед знаком «?» стоит точка последовательности. Это означает, что верно следующее: ++ x? х: у;
Йоханнес Шауб - лит,
1
@ Дэниел, это то, что я имел в виду, когда имел в виду выражения, а не утверждения. Я, вероятно, не достаточно подробно рассказал о разнице, поэтому спасибо за некоторые пояснения.
Ричард
6

Вы можете просто переписать это как:

int qempty(){ return(f==r);}

Что делает то же самое, что и в других ответах.


источник
это приведет к неявному преобразованию логического значения в int
Дон Чидл
6

Просто примечание, если вы когда-нибудь это увидите:

a = x ? : y;

Это расширение стандарта GNU (см. Https://gcc.gnu.org/onlinedocs/gcc/Conditionals.html#Conditionals ).

Это то же самое, что и

a = x ? x : y;
Ник Косифидис
источник
в CLang (по крайней мере, в самых последних версиях) это расширение также доступно. Он доступен даже при отключенном флаге C ++ 11 в проекте qmake. Итак, выражение типа int x = 1+1 ? : 0 ; правильно возвращается 2 в моем компиляторе, и это ни на что не жаловалось.
Винисиус А. Хорхе
3

Это условный оператор.

а? до н.э

Это ярлык для IF / THEN / ELSE.

означает: если a истинно, вернуть b, иначе вернуть c. В этом случае, если f == r, вернуть 1, иначе вернуть 0.

Джо
источник
2

Знак вопроса - это условный оператор. Код означает, что если f == r, то возвращается 1, в противном случае возвращается 0. Код можно переписать как

int qempty()
{
  if(f==r)
    return 1;
  else
    return 0;
}

что, вероятно, не самый чистый способ сделать это, но, надеюсь, поможет вам понять.

ссакл
источник