2017-01-04 1 views
0

나는 3 진 연산자 ("? :")를 if 문처럼 사용하고 싶다. 정확하게 말해서 나는 (temp> 0) if increment else '아무것도하지 않는다.3 진 연산자를 if 문처럼 사용하는 방법?

  temp?i++:WHAT_SHOULD_COME_HERE_SO_NO_CHANGES_ARE_MADE_ANYWHERE 
+6

그런 다음 삼항 연산자를 사용하지 않는 ... 다른 사람들이 이해하고 대신 기존의 양식을 사용하는 경우 유지하는 코드는 쉽게 될 것인가? – Li357

+0

'?'는'if ... else'를 나타냅니다. 'if'가있는 경우'if (condition) action;을 사용하지 않는 이유 – NathanOliver

+0

"else"부분을 비워 둘 수 없습니다. –

답변

6

대답

는 엄밀히 말하면, 당신은이 작업을 수행 할 수 있습니다 : 세 번째 피연산자에 가야

(boolean expression) ? (returning expression) : /* no-op */; 

뭔가. 그러나 세 가지 연산자를 평가하는 사후 조건 측면에서 무언가와 행동 상으로 동등한 "무언가"를 만들 수 있습니다. 아래를 참조하십시오.


터너 연산자 값을 반환해야

설명 및 형태는 두 번째와 세 번째 오퍼랜드의 각각의 복귀 형태의 슈퍼는 가장 파생 형으로 추론된다. 따라서 세 번째 피연산자가 빈 표현식이면 (즉, 아무 것도 반환하지 않는 경우) 컴파일러는 전체 연산자에 대한 반환 유형을 추론 할 수 없습니다. 따라서 컴파일되지 않습니다. 삼항 연산자를 사용


솔루션

:

i = temp>0 ? i+1 : i; 

또는

:

당신이 정말로 원하는 경우, 이것은 당신이 삼항 연산자를 사용하여 그것을 할 수있는 방법입니다

temp>0 ? ++i : i; 

기본 구문 : 당신이 찾고있는 모두가 한 줄을 경우

은 다음 구문을 선호하고 있지만 :

if (temp>0) ++i; 
+0

두 번째 옵션은, 만약 당신이 그것을 할 것이라면 중괄호를 제거하십시오. 또한 첫 번째 괄호는 중복되어 있습니다. – Li357

+0

@AndrewLi 특히 하위 표현식이 다중 연산자 표현식 일 때마다 괄호와 중괄호를 사용하는 습관을 가독성있게 보았습니다. (더 나은 시각적 묘사) 당신이 옳긴하지만, 나는이 경우 적용되지 않는다고 생각합니다. – Travis

+0

downvote를 설명하는 데주의해야합니까? – Travis

2

표현식에 삼항 연산자가 사용됩니다. 따라서 전체 표현식은 단일 값으로 평가되어야합니다. 즉, "if"및 "else"절을 모두 입력해야합니다. "else"부분을 공백으로 남겨 둘 방법이 없습니다.

또한이 같은 표현식 안에 증가 연산자를 삽입하는 것은 부작용의 결과가 오류가 발생하기 쉽지 않으므로 권장하지 않습니다.

4

이 작동됩니다

(void) ((temp>0)?i++:0); 

(void)는 코드의 동작을 변경하지 않습니다. 오히려 그것은 표현의 결과가 고의적으로 버려진다는 것을 독자 (그리고/또는 미래에 호출 할 수있는 스타일 검사 프로그램)에게 알려주는 것입니다. 이를 사용하지 않으면 컴파일러 및/또는 버그를 의심하고 코드를 "수정"하려고하는 다른 프로그래머로부터 경고를받을 수 있습니다.

사실, 위의 내용은 당신이하려는 일을 표현하는 매우 특별한 방법이기 때문에 어쨌든이를 얻을 수 있습니다.

if (temp>0) i++; 
+1

'void '주조가있는 부분이 작동하지 않습니다. 형변환을 사용하려면 전체 표현식에 괄호를 추가하십시오 (그러나 추악 해집니다). – anatolyg

+0

네 말이 맞아. 나는 괄호를 추가했습니다. 이미 추악했기 때문에 아무것도 잃어 버리지 않았습니다. –

0

당신이 할 수 있습니다 :

int temp = 20, i = 0; 

    (temp)? i++: i; 

    cout << i << endl; 
관련 문제