함수 내에서이 두 문 사이에 차이점이 있습니까?
bool returnValue = true;
// Code that does something
return(returnValue);
이?
bool returnValue = true;
// Code
return returnValue;
전자는 주위에 괄호가 있습니다 returnValue
.
함수 내에서이 두 문 사이에 차이점이 있습니까?
bool returnValue = true;
// Code that does something
return(returnValue);
이?
bool returnValue = true;
// Code
return returnValue;
전자는 주위에 괄호가 있습니다 returnValue
.
c++
/에 대해이 질문에 답하기는 어렵습니다 c
. 언어 정의에 대해 좀 더 구체적으로 설명하는 것이 좋지만 9 년 후이를 수정하는 방법을 모르겠습니다.
답변:
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
하고 두 번째 func1
는 int&
. 의미론의 차이는 둘러싼 괄호와 직접 관련이 있습니다 .
auto
최신 형식 의 지정자는 C ++ 11에 도입되었습니다. 에서 C ++ 언어 사양 이는 다음과 같이 설명되어 있습니다 :
선언되는 변수의 유형이 초기화 프로그램에서 자동으로 추론되도록 지정합니다. 함수의 경우 반환 유형이 후행 반환 유형이거나 반환 문에서 추론되도록 지정합니다 (C ++ 14 이후).
또한 C ++ 11 decltype
은 C ++ 언어 사양에 설명 된 지정자를 도입했습니다 .
선언 된 엔티티 유형을 검사하거나 표현식의 반환 유형을 쿼리합니다.
[한조각]
인수가 객체 / 함수의 괄호로 묶지 않은 이름이거나 멤버 액세스 표현식 (object.member 또는 pointer-> member)이면 decltype은이 표현식에 지정된 엔티티의 선언 된 유형을 지정합니다.
인수가 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 (x);
에 해당 return &x;
않으며이의 반환 초래하는 것이 가능해야한다 x의 값이지만 x에 대한 유형 참조가 있습니다.
auto
꽤 자주 사용 합니다. 우리가 멀리 떨어져있는 한 우리의 의미는 결코 변하지 decltype
않습니까? 다음 Visual Studio를 통합하는 다음 컴파일러 버전으로 이동할 때 예기치 않은 동작이 두렵습니다.
return m * x + c
및 return (m * x + c)
또는 return ( (m * x) + c )
등 사이에는 기능적 차이 가 없습니다.-나에게 물어 보면 더 나아지거나 더 직관적으로 보이지 않습니다.
위 예제의 괄호는 불필요합니다. 그들은 효과적으로 무시됩니다.
다음과 같을 것입니다 ...
int x = (5);
여기에있는 괄호도 무시됩니다.
AFAIK, 다른 것은 없습니다.
C ++에서 표현식은 expr
또는 (expr)
. 그래서 후자는 타이핑이 더 많은 표현입니다. 이에 대한 자세한 내용 은 문법을 참조하십시오 ( "표현식"찾기).
차이 없음!!
복잡한 표현이 포함 된 경우 사람들은 괄호를 사용합니다.
BTW return
는 함수가 아닌 명령문입니다.
식을 쉽게 읽고 명확하게 만들 수 있다면 괄호를 포함 할 수 있지만 둘 사이에는 차이가 없습니다.
return
은 탐욕스러운 운영자 라고 생각 하고 나머지는 버리고 return m * x + c
돌아올 수 m
있습니까?
당신은 컴파일러의 속도를 늦추고 있습니다!
괄호가 있으면 전처리 단계가 느려질뿐만 아니라 더 복잡한 추상 구문 트리도 생성됩니다. 더 많은 메모리, 더 많은 계산.
의미 론적 관점에서? 그들은 정확히 동일합니다. 괄호가 있는지 여부에 관계없이 return
문은 표현식을 반환하기 전에 완전히 평가합니다.
그들은 동일합니다. 나는 괄호 구문을 꽤 자주보고 그것을 사용하는 사람들에게 항상 묻습니다. 왜 ? 그리고 아무도 왜 그것을 사용하는지 대답 할 수 없습니다.
퉁명스럽게 요약하자면, 함수와 같은 매크로와 함수의 차이를 잘 이해하지 못하거나 C에서 연산자 우선 순위 또는 평가 규칙의 순서에 대해 혼란스러운 사람들이 표현식을 반환하는 괄호를 사용합니다. 코딩이 없습니다. 괄호를 사용하면 스타일 이점이 있습니다.
그러므로
return value;
보다 정확하다
return (value)
후자는 당신이 무엇을하는지 잘 모른다는 것을 암시하기 때문입니다. :)
둘 다 귀하의 경우 동일합니다.
a
이며 5
다음 return a++;
과 return (a++);
(어떤이 동일) 것 모두 반환5