Stroustrup의 예에서 콜론은 "return 1 : 1"에서 무엇을 의미합니까?


163

콜론의 특정 용도를 이해하지 못합니다.

이 책 Bjarne Stroustrup 의 C ++ 프로그래밍 언어 , 제 4 판, 11.4.4 "Call and Return"섹션, 297 페이지에서 찾아 볼 수 있습니다.

void g(double y)
{
  [&]{ f(y); }                                               // return type is void
  auto z1 = [=](int x){ return x+y; }                        // return type is double
  auto z2 = [=,y]{ if (y) return 1; else return 2; }         // error: body too complicated
                                                             // for return type deduction
  auto z3 =[y]() { return 1 : 2; }                           // return type is int
  auto z4 = [=,y]()−>int { if (y) return 1; else return 2; } // OK: explicit return type
}

혼란스러운 콜론은 7 번 줄에 나타납니다 return 1 : 2. 나는 그것이 무엇인지 모릅니다. 레이블 또는 삼항 연산자가 아닙니다.

첫 번째 멤버가없는 (및없는 ?) 조건부 삼항 연산자처럼 보이지만 그 경우 조건없이 작동하는 방법을 이해하지 못합니다.


6
내 끝에 컴파일 오류입니다 (gcc 및 clang). 또한 이러한 모든 줄에는 세미콜론이 필요하지만 여전히 오류가 있습니다.
Cruz Jean

216
사회자 주 : 이 질문을 "오타"질문으로 마무리하기 위해 투표를하기 전에 신중하게 생각하십시오. 그렇습니다. 문제는 오타이지만 질문자가 만든 오타가 아닙니다. 오히려 그것은 출판 된 책에서 발견 된 것입니다. 이는이 질문과 그 답변이 미래에 다른 사람들에게도 유용 할 수 있음을 의미하며, 이는 오타로 닫는 강력한 카운터 표시기입니다. (업데이트 :이 주제는 현재 메타에 대해 논의 중입니다 . 부담없이 말씀해주세요.)
Cody Grey

3
아마도 가장 좋은 대답은 다음과 같습니다. 코드를 컴파일하십시오. 컴파일되지 않으면 오타임을 나타냅니다.
jrw32982는 Monica

나는 하나의 컴파일러에서 컴파일 (또는 내부 컴파일러 오류가 발생) 실패 내 머리 위로 떨어져 예를 생각해 볼 수 있지만, 다른 하나 문제없이 허용됩니다
J. 안토니오 페레즈

1
@ John 방금 MSVC로 폴드 표현식을 시도했지만 컴파일하지 않았습니다. 내가 방금 읽은 장 전체가 오타 여야합니까? ;) C ++ 컴파일러는 항상 유효한 C ++ 코드를 컴파일하지 못합니다. 언어는 터무니없이 복잡합니다.
Voo

답변:


205

이 책의 오타입니다. C ++ Programming Language의 두 번째 및 세 번째 인쇄는 에라타를 보십시오 . 예는 다음과 같아야합니다.

auto z3 =[y]() { return (y) ? 1 : 2; }

11
(y)뿐 아니라 y?
작은 도우미

7
@LittleHelper 아마도 최선의 방법 또는 무언가, 나는 항상 그런 식으로 쓰여진 것을 봅니다. 좀 더 복잡한 비교와 혼동을 피할 수 있습니다 ...
Redwolf Programs

28
개인적으로, 나는 (cond) ? a : b명확성을 위해 종종 사용 합니다-그것은 코드를 훑어 볼 때 foo = x > y ? a : b와 같은 진술 을 잘못 읽지 않도록 도와줍니다 foo = x ....
user1686 년

8
@LittleHelper 그것은 실제로 필요하지 않습니다. 그러나 함수와 유사한 매크로에서는 괄호를 사용하는 인수를 괄호로 묶는 것이 좋습니다. 그렇지 않으면 인수를 확장하면 예기치 않은 동작이 발생할 수 있습니다. 함수형 매크로를 사용하여 "foo (2 + 3)"으로 호출하는 값 "foo (x) x * 2"를 두 배로 늘리십시오. 인수는있는 그대로 확장되고 우선 순위 규칙이 인수되므로 결과는 2+ (3 * 2)입니다. 매크로가 "foo (x) (x) * 2"이면 올바르게 (2 + 3) * 2가됩니다. Stroustrup은 코딩 안전을 위해 모든 곳에서 해당 스타일을 사용하는 습관을 가지고 있습니다.
Graham

2
@Graham 매우 드 like니다. Stroustrup은 본질적으로 함수 매크로를 작성하지 않습니다 (C ++ 인라인 함수가 더 좋습니다). 삼항 연산자는 다소 복잡한 우선 순위 규칙을 가지고 있기 때문에 아마도 Parens로 우선 순위를 습관적으로 명확히하는 것이 좋습니다.
Martin Bonner는 Monica를 지원합니다

19

간단한 오타처럼 보입니다. 아마도 :

auto z3 =[y]() { return y ? 1 : 2; }

람다는 매개 변수를 사용하지 않으므로 파렌은 선택 사항입니다. 원하는 경우이를 대신 사용할 수 있습니다.

auto z3 =[y] { return y ? 1 : 2; }

11

return 1 : 2; 구문 오류이며 유효한 코드가 아닙니다.

올바른 진술은 return (y) ? 1 : 2;대신 더 비슷할 것입니다.

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