Що означає "?" робити в C ++?


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

У наведеному фрагменті що означає " ? " Чим ми можемо його замінити?


22
Звичайно, у цьому конкретному випадку ви можете просто замінити його поверненням f == r;
Eclipse

6
@Eclipse: Я б не покладався на неявне перетворення bool-> int, якщо зможу цього уникнути.
Даніель Даранас

2
@DanielDaranas чому б ні? (Це своєрідне запитання для початківців - пояснення ваших коментарів для початківців було б дуже корисним і вдячним.)
Michael Hoffmann

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

1
Можливо, але питання, відповідь та коментар були написані в 2009 році.
JohnMcG

15

Це потрійний оператор, в основному це вбудований оператор if

x ? y : z

працює як

if(x) y else z

крім замість висловлювань у вас є вирази; так що ви можете використовувати його в середині більш складного висловлювання.

Це корисно для написання стислого коду, але його можна зловживати для створення важкого в обслуговуванні коду.


4
варто знати, що на "?" є точка послідовності. Це означає, що діє наступне: ++ x? х: у;
Йоханнес Шауб - літб,

1
@Daniel, це те, що я мав на увазі, маючи вирази, а не висловлювання. Я, мабуть, недостатньо чітко говорив про різницю, тож дякую за додавання роз’яснень.
Річард

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 , у моєму компіляторі, і це ні на що не скаржилося.
Vinícius A. Jorge


3

Це умовний оператор.

а? b: c

Це ярлик для 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;
}

що, мабуть, не найчистіший спосіб це зробити, але, сподіваємось, допомагає вашому розумінню.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.