return 문에서 결과 주위의 괄호가 의미가 있습니까?


79

함수 내에서이 두 문 사이에 차이점이 있습니까?

bool returnValue = true;
// Code that does something
return(returnValue);

이?

bool returnValue = true;
// Code
return returnValue;

전자는 주위에 괄호가 있습니다 returnValue.


감사합니다 Rob, 질문의 정신을 성공적으로 포착했습니다. Essence에서 나는 컴파일러가 특별한 일을했는지 ​​(표현식을 먼저 평가하려고 시도하는 것과 같이) 아니면 그냥 무시했는지 궁금했습니다.
Jose Villalta

1
모든 c++ /에 대해이 질문에 답하기는 어렵습니다 c. 언어 정의에 대해 좀 더 구체적으로 설명하는 것이 좋지만 9 년 후이를 수정하는 방법을 모르겠습니다.
Jonas Stein

답변:


122

C ++ 14부터는 종종 그렇습니다.

C ++ 14는 반환 값 주위의 괄호가 의미 체계를 변경할 수있는 프린지 케이스를 추가합니다. 이 코드 조각은 선언되는 두 가지 함수를 보여줍니다. 유일한 차이점은 반환 값을 괄호로 묶는 것입니다.

int var1 = 42;
decltype(auto) func1() { return var1; } // return type is int, same as decltype(var1)
decltype(auto) func1() { return(var1); } // return type is int&, same as decltype((var1))

첫 번째 func1는 an을 반환 int하고 두 번째 func1int&. 의미론의 차이는 둘러싼 괄호와 직접 관련이 있습니다 .

auto최신 형식 의 지정자는 C ++ 11에 도입되었습니다. 에서 C ++ 언어 사양 이는 다음과 같이 설명되어 있습니다 :

선언되는 변수의 유형이 초기화 프로그램에서 자동으로 추론되도록 지정합니다. 함수의 경우 반환 유형이 후행 반환 유형이거나 반환 문에서 추론되도록 지정합니다 (C ++ 14 이후).

또한 C ++ 11 decltypeC ++ 언어 사양에 설명 된 지정자를 도입했습니다 .

선언 된 엔티티 유형을 검사하거나 표현식의 반환 유형을 쿼리합니다.

[한조각]

  1. 인수가 객체 / 함수의 괄호로 묶지 않은 이름이거나 멤버 액세스 표현식 (object.member 또는 pointer-> member)이면 decltype은이 표현식에 지정된 엔티티의 선언 된 유형을 지정합니다.

  2. 인수가 T 유형의 다른 표현식이면

    a) 표현식의 값 범주가 xvalue이면 decltype은 T &&를 지정합니다.

    b) 표현식의 값 범주가 lvalue이면 decltype은 T &를 지정합니다.

    c) 그렇지 않으면 decltype은 T를 지정합니다.

[한조각]

객체의 이름이 괄호로 묶이면 lvalue 표현식이되므로 decltype (arg) 및 decltype ((arg))은 종종 다른 유형입니다.

C ++ 14에서는 decltype(auto)함수 반환 유형 에 사용할 수있는 기능이 허용되었습니다. 원래의 예는 괄호를 사용한 의미 적 차이가 작용하는 곳입니다. 원래 예를 다시 살펴보기 :

int var1 = 42;
decltype(auto) func1() { return var1; } // return type is int, same as decltype(var1)
decltype(auto) func1() { return(var1); } // return type is int&, same as decltype((var1))

decltype(auto)함수의 후행 반환 유형을 return 문의 엔티티 / 표현식에서 추론 할 수 있습니다. 첫 번째 버전 return var1;에서는 유형 decltype(var1)( int위의 규칙 1에 의한 반환 유형)을 반환 return (var1);하는 것과 실질적으로 동일 하고 두 번째 경우 decltype((var1))( int &규칙 2b에 의한 반환 유형 )와 사실상 동일 합니다.

괄호는 int&대신 반환 유형을 만들 int므로 의미 체계가 변경됩니다. 이야기의 도덕- "반환 유형의 모든 괄호가 동일하게 생성되는 것은 아닙니다."


괄호가없는 return 문은 여전히 ​​lvalue 표현식입니다. 해당 시나리오에서 xvalue로 취급되지 않는 한. 괄호없이 수익의 가치 범주를 설명 할 수 있습니까?
void.pointer

1
return 문은 입력 된 표현식의 읽기를 반환합니다. 즉, 포함 된 표현식에서 rvalue를 캡처하여 반환합니다. lvalue를 반환하지 않습니다. 어떤 컴파일러는 당신이 여기 줄의 설명과 일치하는 버그가 있다고 할 수 있으며, 그 이유에 대해 여기 제공하지만,이 사건 않을 것 return (x);에 해당 return &x;않으며이의 반환 초래하는 것이 가능해야한다 x의 값이지만 x에 대한 유형 참조가 있습니다.
Theodore Murdock 2016

4
와, 정말 끔찍한 언어 구조입니다. 완전히 ... 불투명합니다. 그래도 좋은 글 이네요, 감사합니다.
Paul Sanders

5
C ++는 매우 흥미로운 언어입니다. 그러나 숨겨진 이런 종류 나 견과류 가끔 드라이브 "기능"...
andreee

우리 코드는 불필요한 괄호로 가득 차 있습니다. 우리는 또한 auto꽤 자주 사용 합니다. 우리가 멀리 떨어져있는 한 우리의 의미는 결코 변하지 decltype않습니까? 다음 Visual Studio를 통합하는 다음 컴파일러 버전으로 이동할 때 예기치 않은 동작이 두렵습니다.
OneWorld

6

다른 점이 없다.

괄호를 사용하는 한 가지 이유는 반환하기 전에 표현식을 평가하려는 경우이지만 예제에서는 이유가 없습니다. 보다:

반환 값을 둘러싼 괄호

추가 논의를 위해.


3
복잡한 표현이 있더라도이 괄호는 여전히 다른 동작을 일으키지 않습니다. 그들은 단지 인간 독자들에게 의미를 더 분명하게 (주관적으로!) 만듭니다.
aschepler

@Karl "괄호를 사용하는 한 가지 이유는 반환하기 전에 표현식을 평가하려는 경우입니다."이에 대한 예를들 수 있습니까?
Chris Middleton

3
@ChrisMiddleton 아니요, 주장은 해당 스레드에서와 마찬가지로 여기에서 무의미하기 때문입니다. return m * x + creturn (m * x + c)또는 return ( (m * x) + c )등 사이에는 기능적 차이 가 없습니다.-나에게 물어 보면 더 나아지거나 더 직관적으로 보이지 않습니다.
underscore_d

5

위 예제의 괄호는 불필요합니다. 그들은 효과적으로 무시됩니다.

다음과 같을 것입니다 ...

int x = (5);

여기에있는 괄호도 무시됩니다.


글쎄, 기술적으로 그들은 무시 되지 않고 표현의 가치에 영향을 미치지 않습니다.
John Bode 2011 년

1
@John : 사실상 무시되었습니다. :)
James

3
+1… 이것은 괄호가 실제로 중복 되어 사용이 약간 어리 석다는 것을 보여주는 유일한 대답입니다 .
Konrad Rudolph

4

AFAIK, 다른 것은 없습니다.

C ++에서 표현식은 expr또는 (expr). 그래서 후자는 타이핑이 더 많은 표현입니다. 이에 대한 자세한 내용 은 문법을 참조하십시오 ( "표현식"찾기).


David, 링크 주셔서 감사합니다. Stroustrup의 C ++ 책에 문법이 있지만 (게으름 때문에) 그렇게 많이 보지 마십시오. 이제 브라우저에 북마크를 추가 했으므로 더 자주 참조 할 수 있습니다.
Jose Villalta 2011 년


3

나는 boo오타 라고 생각 하고 당신은

return expr;

return(expr);

대답은 '아니오.


2

차이 없음!!

복잡한 표현이 포함 된 경우 사람들은 괄호를 사용합니다.

BTW return는 함수가 아닌 명령문입니다.


2

식을 쉽게 읽고 명확하게 만들 수 있다면 괄호를 포함 할 수 있지만 둘 사이에는 차이가 없습니다.


1
...하지만 결코 그렇지 않습니다. 왜 그럴까요? 괄호로 묶지 않은 표현에 대해 읽기 어려운 것은 무엇입니까? 괄호를 추가하는 것은 나에게 혼란스러워 보입니다. 더 명확 해 보이면 사람들 return은 탐욕스러운 운영자 라고 생각 하고 나머지는 버리고 return m * x + c돌아올 수 m있습니까?
underscore_d

1

당신은 컴파일러의 속도를 늦추고 있습니다!

괄호가 있으면 전처리 단계가 느려질뿐만 아니라 더 복잡한 추상 구문 트리도 생성됩니다. 더 많은 메모리, 더 많은 계산.


의미 론적 관점에서? 그들은 정확히 동일합니다. 괄호가 있는지 여부에 관계없이 return문은 표현식을 반환하기 전에 완전히 평가합니다.


5
내 생각이 정확히. 컴파일러가 쓸모없는 혼란을 파싱하는 불필요한 작업을하게함으로써 별다른 이유없이 우주의 열사병에 가까워지고 있습니다.
Maxim Egorushkin 2011 년

4
비트 코인에 대해 어떻게 생각하세요?
Jeremy Nikolai

0

그들은 동일합니다. 나는 괄호 구문을 꽤 자주보고 그것을 사용하는 사람들에게 항상 묻습니다. ? 그리고 아무도 왜 그것을 사용하는지 대답 할 수 없습니다.

퉁명스럽게 요약하자면, 함수와 같은 매크로와 함수의 차이를 잘 이해하지 못하거나 C에서 연산자 우선 순위 또는 평가 규칙의 순서에 대해 혼란스러운 사람들이 표현식을 반환하는 괄호를 사용합니다. 코딩이 없습니다. 괄호를 사용하면 스타일 이점이 있습니다.

그러므로

return value;

보다 정확하다

return (value)

후자는 당신이 무엇을하는지 잘 모른다는 것을 암시하기 때문입니다. :)


-3

둘 다 귀하의 경우 동일합니다.


MM 귀하의 의견을 설명해 주시겠습니까?
Zeshan Khan 15.10.26

1
경우 a이며 5다음 return a++;return (a++);(어떤이 동일) 것 모두 반환5
MM

2
구체적으로 postinc / decrement는 피연산자의 수정 전 값을 반환하며 괄호 나 기타 강제 시도의 양은 변경되지 않습니다.
underscore_d
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.