2017-12-01 1 views
0

: 좌변은 <- 내가 얻을 그나마이 그 항상 내가이 작업을 수행 할 때마다 나타나는 이유

((unsigned char)a.ID[b])=((unsigned int)a.ID[b])/ 10; 

는 자사의 서명 숯불 a.ID을하고 비트의 그룹을 포함

+3

캐스트 결과에 지정할 수 없습니다. – Barmar

+0

이미'unsigned char' 일 때'a.ID [b]'를 캐스팅하는 이유는 무엇입니까? 당신은 계산을위한 타입을 바꾸기 위해 오른쪽을 던져 넣었습니다. 당신은 필요하지 않습니다. (끔찍한 포인터 앨리어싱과 역 참조를 제외하고) 오른손을 새로운 타입으로 배정하여 배정하십시오. – ShadowRanger

+1

제목을 "과제의 왼쪽 피연산자로 필요한 왼쪽 값"으로 변경하려고 시도했지만 이미 제목과 관련된 질문이 있으므로 SO는 허용하지 않습니다. Lol. –

답변

3

할당 대상은 lvalue 여야합니다. 즉, 변수 위치를 나타내는 표현식이어야합니다. 그러나 캐스트 표현식은 메모리의 특정 저장 위치와 관련이없는 값인 rvalue를 반환합니다. 캐스트 표현식에 할당하려고 시도하는 것은 의미가 없으며 저장할 수있는 장소가 아닙니다.

당신은 모두 오른쪽에 캐스트 할 필요가 :

a.ID[b] = (unsigned char)(((unsigned int)a.ID[b])/ 10); 

내부 캐스트는 unsigned char 변환 unsigned int에 연산을 수행하기 전에, 다음 외부 캐스트 다시 unsigned char 그 결과를 변환합니다.

하지만 처음에는 캐스트가 필요하지 않습니다. char은 정수 유형이므로 int과 마찬가지로 연산을 수행 할 수 있습니다. 원래 unsigned char10으로 나눈 결과는 처음으로 unsigned int으로 캐스팅 한 것과 같습니다. 다음과 같이 간단하게 쓸 수 있습니다 :

a.id[b] /= 10; 
+0

계산하기 전에 의도적으로 'unsigned'로 변환하려는 경우 (형식이 서명 될 경우 차이를 만들 수 있음) 가장 쉬운 방법은 '10'대신 '10U'를 사용하는 것입니다. –

+0

그러나이 경우 원래 유형은 부호가 없으므로 계산하기 전에 크기를 확장하고 있습니다. 추가 나 곱셈을하면 효과가 있지만 나눌 때는 효과가 없습니다. – Barmar

+0

예, 알고 있습니다. 나는 사람들이 캐스트를 철자하기 쉽고 올바른 유형의 상수를 사용하는 것이 충분하기 때문에 그냥 말하고있었습니다. –

관련 문제