C 및 C ++에서 (int) + 4 * 5 표현식을 허용하는 이유는 무엇입니까?


86
(int) + 4*5;

이것이 가능한 이유는 무엇입니까 (값이 있는 유형 추가) ? (g ++ 및 gcc로 시도했습니다.)

나는 그것이 의미가 없다는 것을 알고 있지만 (효과가 없음) 이것이 가능한 이유를 알고 싶습니다.


19
과 동일한(int)-4*5
P__J 폴란드 여성을 지원

45
cppinsights컴파일러 프런트 엔드 관점에서 코드가 어떻게 보이는지 이해하는 데 도움 이되는 유용한 도구가 있습니다 . 그것은 또한 온라인 버전을 가지고 있습니다, 당신은 그것이 당신의 예 에 대해 말하는 것을 볼 수 있습니다 (당신이 주어진 대답과 동일한 '괄호')
Nikita Kniazev

22
이 문에 해당 +(int)+ 4*5;하고 -(int)- 4*5;그리고 -+-+-(int)-+-+- 4*5;덜 시적;
chqrlie

16
어떤 부분이 당신을 당혹스럽게합니까? 내가 아는 한, 당신은 기호를 표시하지 않고 5를 쓸 수있는 이유를 묻는 것입니다.
Carsten S

5
C ++에서 C 유형 캐스트가 C ++에서 권장되지 않는다고 경고해야하지 않습니까?
Mr Lister

답변:


141

+여기 단항 +연산자 가 아닌 바이너리 더하기 연산자 . 여기에는 추가가 없습니다.

또한 구문 (int)은 형변환에 사용됩니다.

그 진술을 다음과 같이 다시 읽을 수 있습니다.

(int) (+ 4) * 5;    

다음과 같이 구문 분석됩니다.

((int) (+ 4)) * (5);    

즉,

  1. +정수 상수 값에 단항 연산자를 적용합니다 4.
  2. typecast to an int
  3. 피연산자로 곱하다 5

이것은 (int) (- 4) * (5);단항 연산자의 사용법이 더 익숙한에서 와 유사합니다 .

귀하의 경우에는 단항 +과 캐스트가 int모두 중복됩니다.


50
"타입 캐스팅"이 아닌 "캐스팅"입니다. 타입 캐스팅은 배우들에게 일어나는 일입니다.
Keith Thompson

8
(+ 4)피연산자를 만들지+4 않는다는 것은 피연산자 에 단항 +을 적용하는 것을 의미합니다. 4이는 실제로 OP의 경우에는 작동하지 않지만 다른 상황에서는 정수 승격 또는 배열 붕괴를 일으킬 수 있습니다. 예를 들어 char c = 0; sizeof +c == sizeof c아마도 거짓과 sizeof +"a"하지 2. 아마
chqrlie

7
"모두 중복"- 모든 게처럼 중복 42;:-)
paxdiablo

11
Type Casting이라는 용어를 사용하는 데 아무런 문제가 없습니다. 내가 유일한 사람이 아닌 것 같습니다 .
Ben

14
@Ben Typecasting은 유형 캐스팅이 아닙니다.
Kenneth K.

40

이것은로 해석됩니다 ((int)(+4)) * 5. 즉, 표현식 +4(리터럴에 적용된 단항 더하기 연산자 4), intC 스타일 캐스트 를 사용하여 유형 으로 캐스트하고 결과에 5.

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