“int main () {(([] () {}) ());}”은 어떻게 C ++에 유효합니까?
나는 최근에 다음과 같은 난해한 코드를 보았습니다.
int main(){(([](){})());}
더 읽기 쉽게하려면 다음과 같이 다시 포맷하십시오.
int main(){
(([](){})()); // Um... what?!?!
}
그러나 (([](){})())
유효한 코드가 어떻 습니까?
- 함수 포인터 구문처럼 보이지 않습니다.
- 연산자 오버로드 트릭이 될 수 없습니다. 코드는 그대로 컴파일됩니다.
Google은이 모든 기호 검색에 큰 도움이되지 않았습니다. 그러나 Visual Studio 2010에서 컴파일되어 아무것도 출력하지 않습니다. 오류나 경고가 없었습니다. 따라서 유효한 코드처럼 보입니다.
Javascript 및 C 함수 포인터 외부에서 기괴한 유효한 코드를 본 적이 없습니다 .
누군가 이것이 이것이 어떻게 유효한 C ++인지 설명 할 수 있습니까?
이 코드는 본질적으로 빈 람다를 호출합니다.
처음부터 시작합시다 : [](){}
빈 람다 식 입니다.
그런 다음 C 및 C ++에서 표현식을 Parens로 랩핑 할 수 있으며 표현식 없이 작성 하는 것과 똑같이 † 동작 하므로 람다 주변의 첫 번째 Parens 쌍이 수행합니다. 우리는 지금에 ([](){})
있습니다.
그런 다음 ()
첫 번째 줄 바꿈 후 (빈) 람다를 호출합니다. 우리는 지금([](){})()
전체 표현은 다시 괄호 안에 싸여지고 우리는 얻는다 (([](){})())
.
마지막으로 ;
진술을 끝냅니다. 에 도착 (([](){})());
합니다.
†있다 일부 와 마찬가지로 C에서 적어도 코너의 경우는, ++ T a_var;
사이에 차이가있어 decltype(a_var)
하고decltype((a_var))
.
참고 URL : https://stackoverflow.com/questions/13603286/how-is-int-main-valid-c
'IT' 카테고리의 다른 글
Python 2.7에서 하위 프로세스의 출력을 숨기는 방법 (0) | 2020.04.01 |
---|---|
git (버전 제어)에서 데이터베이스를 어떻게 배치 할 수 있습니까? (0) | 2020.03.31 |
차고에 차가 있습니까? (0) | 2020.03.31 |
젠킨스 vs 트래비스 CI. (0) | 2020.03.31 |
자바 스크립트 파일 이름 명명 규칙은 무엇입니까? (0) | 2020.03.31 |