2010-07-15 12 views
8

그래서 삼진 연산자 (적어도 Visual C++ 98-2010에서는)에 대해 몰랐던 흥미로운 점을 발견했습니다. http://msdn.microsoft.com/en-us/library/e4213hs1(VS.71).aspx에서 지적했듯이 expression과 conditional-expression이 모두 l 값인 경우 결과는 l 값입니다.C++ 삼항 연산자

당신은 같은 것을 써서 ++ 보통의 C/C가 물론

: 심지어 r 값/L 값 involvment 신경

int value = (x == 1) ? 1 : 0;

결코를,이 경우도 1이나 0 l 값으로 변환 가능합니다.

int value = (x == 1) ? y : z;

Y 및 Z 모두 -1- 값들은,보다 구체적으로, 그 중 하나는 원 운전자의 실제 결과는 경우 (그 저장된 값 :

그러나, 같은 것을 취할) 반드시 분명하지는 않습니다 (적어도 나는 그것에 대해 생각 해본 적이 없다). 즉 리드 무엇

하지만, 99를 할당 다음

(x == 1 ? y : z) = 99;

를 작성하는 기능이다 (Y)의 경우, Z의 경우 X! = 1

I에 X == 1 99 어디서나 그리고 모든 논의에서 내가 사용했던 (또는, 보통, 사용할지 여부) 3 진 연산자에 대해 읽은 것을 보지 못했습니다. 표현 조건부 표현 모두

(x == 1 ? 0 : z) = 99;

0으로 행복하게 컴파일러에 의해 지적에 R 값이기 때문에 컴파일에 실패 같은 1- 값 뭔가 있다면 물론

은에만 작동합니다.

그리고 당신은

x == 1 ? y : z = 99;

는 경우에만 Z에 99을 할당 완전히 다른 무언가 괄호 포함하는 경우에만 작동 (X에게! = 1) 아름다운 부분은 양측이 여전히 리터 있다는 것입니다 값은 (x == 1 ? y : z = 99) = 100과 같은 것의 심각한 쥐 구멍이 있습니다 (x == 1의 진리에 따라 y 또는 z에 100을 지정하고 x == 1이 false 인 경우 z = 99 지정에 대해 쾅쾅 소리를냅니다)

그럼 내 질문에 이르게됩니다.

A)이 부분은 실제 C++ 표준 (그럴 것 같음)의 일부이며 Microsoft의 것만은 아니며 - 보았지만 지금까지이 정보를 찾지 못했습니다.

B) 널리 실현되고 있으며 바위 아래에서 살고 있다면? 내가 기억할 수있는 코드에서는 사용 된 적이 한번도 본 적이 없으며, 삼항 연산자가 논의 될 때 언급 된 코드는 본 적이 없다.

C) 더 자주 나가야합니까?

+1

예) 내 희미한 기억에 따라 B) 예, 거기에 더 많은 공간이 있습니까? C) 도움이 되겠습니까? 무엇으로? – peterchen

+0

(B) 무지가 행복 할 때 '어리 석다'는 현명합니다. –

+1

읽기 어렵 기 때문에 이전에는 본 적이 없습니다. 코드를 읽기가 어렵다는 것은 유지 보수성에 좋지 않습니다. –

답변

10

A) 예, 이것은 표준의 일부입니다.

B) 널리 알려지지는 않았지만 여기에있을 수 있습니다.C++의 # 1 숨김 기능으로 선정 된 이유가 있습니다 : Hidden Features of C++?.

C) 코멘트가 없습니다. :)

개인적으로이 기능을 사용하지 않는 것이 좋습니다. if/else 문을 사용하는 것보다 훨씬 덜 직관적이며 분명히 모든 사람이 그 사실을 알고있는 것은 아닙니다.

나는 내 자신의 경고와는 달리 개인 프로젝트에서 이것을 한 번 사용하려고 시도했는데 괄호가 누락되어 오류를 찾으려고 30 분을 낭비하여 화상을 입었습니다.

+0

글쎄, 내가 게시하기 전에 그것을 건너 왔으면 좋겠다 :) ... 나는 보였지만 분명히 그것을 놓쳤다. – Ruddy

2

이 사용법이 가장 일반적인 것보다 덜 직관적이고 읽기 쉽기 때문에이 사용법을 본 적이 없습니다. 프로덕션 코드에서이 방법을 사용하는 것을 본 적이 없으며 절대로 볼 수 없기를 바랍니다.

Herb Sutter를 기억하십시오. & Andrei Alexandrescu의 C++ Coding Standards 규칙 6 : "정확성, 단순성 및 선명도가 우선입니다."

+0

나는 확실히 그 사용을 옹호하지 않고있다. 단지이 호기심이다. – Ruddy

+0

@Ruddy : 나는 A에 대해서 확실하지 않았다. (99 %는 사실이지만) C : –

3

a 예. § [expr.cond/4 :

번째 및 세 번째 피연산자 lvalues하고 동일한 타입이 있다면, 결과가 형이고 좌변은 ...

(참고 이 하지 C.에서 진정한 명시 적으로 C99 표준에 기록됩니다,,) "A 조건식. 좌변을 양보하지 않는다"

B. 내가 그것을 널리 사용 생각하지 않는 93 각주 사용법이 꽤 모호합니다. 보다 일반적으로 볼 수 있습니다

if (x == 1) 
    y = 99; 
else 
    z = 99; 
+0

FWIW :'(x == 1? y : z)를 컴파일하려고 할 때 컴파일 오류 ("왼쪽 피연산자는 반드시 l- 값이어야합니다")이 표시된다는 점에서 Visual 2010에서 각주 93을 준수하는지 확인했습니다.) = 100;'.c (스트레이트 -C) 파일에서. – Ruddy