'?'는 무엇입니까? C ++에서합니까?


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

위의 스 니펫에서 " ? "는 무엇을 의미합니까? 무엇으로 대체 할 수 있습니까?


22
물론이 특별한 경우에는 그냥 return f == r로 바꿀 수 있습니다.
Eclipse

6
@Eclipse : 피할 수 있다면 암시 적 변환 bool-> int에 의존하지 않을 것입니다.
Daniel Daranas 2009-06-23

2
@DanielDaranas 왜 안돼? (이 종류의 초보자를위한 귀하의 의견에 대한 설명이 매우 도움이와 주시면 감사하겠습니다 질문 - 초보자의입니다.)
마이클 호프만

4
@MichaelHoffmann이 경우 암시 적 변환의 동작은 잘 정의되어 있으므로 사용하는 것이 완벽하게 정확합니다. 표준에 대한 참조는 이 답변 을 참조하십시오 . 개인적으로 저는 암시 적 유형 변환을 사용하지 않습니다. 왜냐하면 코드가 없으면 코드가 더 읽기 쉽고 유지 관리가 가능하고 오류가 덜 발생한다고 생각하기 때문입니다. 나는이 블로그 포스트 에 그것에 대해 더 자세히 썼다 .
Daniel Daranas 2015

답변:


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를 y의 pMember로 초기화합니다. 그렇지 않으면 NULL입니다. 생성자 초기화에 if-else를 넣을 수 없으므로 삼항 연산자가 가능합니다.
JohnMcG

@JohnMcG : 음, C ++ 11 a? b : c에서는 [&]() -> Type { if (a) return b; else return c; }().
celtschk 2014 년

1
아마도,하지만 질문, 대답, 그리고 의견은 2009 년에 기록 된
JohnMcG

15

이것은 삼항 연산자이며 기본적으로 인라인 if 문입니다.

x ? y : z

같이 작동

if(x) y else z

단, 진술 대신에 표현이 있습니다. 더 복잡한 문장의 중간에 사용할 수 있습니다.

간결한 코드를 작성하는 데 유용하지만 유지 관리하기 어려운 코드를 만드는 데 남용 될 수 있습니다.


4
'?'에 시퀀스 포인트가 있다는 것을 아는 것이 좋습니다. 이는 다음이 유효 함을 의미합니다. ++ x? x : y;
Johannes Schaub-litb

1
@Daniel, 그것이 진술보다는 표현이 있다는 의미입니다. 차이점에 대해 충분히 명확하지 않았을 것이므로 설명을 추가해 주셔서 감사합니다.
Richard

6

다음과 같이 다시 작성할 수 있습니다.

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

다른 답변에서 말한 것과 동일한 작업을 수행합니다.


이것은 부울에서 int로 암시 적 변환을 수행합니다
Don Cheadle

6

다음을 본 적이 있다면 참고하세요.

a = x ? : y;

표준에 대한 GNU 확장입니다 ( https://gcc.gnu.org/onlinedocs/gcc/Conditionals.html#Conditionals 참조 ).

다음과 같습니다.

a = x ? x : y;

CLang (적어도 최신 버전)에서는이 확장도 사용할 수 있습니다. qmake 프로젝트에서 C ++ 11 플래그가 꺼진 상태에서도 사용할 수 있습니다. 그래서 int와 같은 표현 x = 1+1 ? : 0 ; 2 내 컴파일러에서 올바르게 반환 하고 이것은 아무것도 불평하지 않았습니다.
비니 A. 호르헤


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;
}

아마도 가장 깨끗한 방법은 아니지만 이해하는 데 도움이되기를 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.