문제는 두 가지입니다. 첫째,
char c = CHAR_MAX;
c += 1;
다른 평가
char c = CHAR_MAX;
c = c + 1;
C11 / C18 6.5.16.2p3 이므로 대답은 아닙니다 .
- 양식의 복합 대입은 lvalue 가 한 번만 평가되고 결정되지 않은 순서로 함수 호출과 관련하여 복합 대입의 연산이 단일 평가
E1 op = E2라는 E1 = E1 op (E2)점을 제외하고 단순 대입 식과 같습니다 E1. E1원자 유형이있는 경우 복합 지정은 memory_order_seq_cst메모리 순서 시맨틱을 사용한 읽기-수정-쓰기 작업입니다 . 113)
그렇다면 의문은에서 일어난다 c = c + 1. 여기 피연산자하는 +일반적인 산술 변환을 받아야하고, c및 1그러므로로 승진 int정말 이상한 구조가이 요구하지 않는, char로 승격됩니다 unsigned int. +그런 다음 의 계산이 평가되고 int/ 유형의 결과 unsigned int가로 변환 char되어에 저장됩니다 c.
있다 3 이 다음 평가 될 수있는 구현 정의 방법 :
CHAR_MIN0이므로 char서명되지 않습니다.
어느 char다음에 승진 int또는 unsigned int과가로 승격 된 경우 int, 다음 CHAR_MAX + 1반드시에 맞는 int도, 그리고 오버 플로우, 또는 것입니다 경우 unsigned int가 맞게 제로 주위에 포장 할 수있다. 모듈로 감소 후 CHAR_MAX + 1또는 수치 0로 감소 된 결과 값이 다시 c모듈로 감소 후로 돌아 오면 , 즉 0이됩니다.CHAR_MIN
그렇지 않으면 char부호가 있고 CHAR_MAX 보다 작 으면 INT_MAX결과 CHAR_MAX + 1가에 적합 int하고 표준 C11 / C18 6.3.1.3p3 이 할당 시 발생하는 변환에 적용됩니다 .
- 그렇지 않으면 새 유형이 서명되고 값을 표시 할 수 없습니다. 결과는 구현 정의되거나 구현 정의 신호가 발생합니다.
또는 iff sizeof (int) == 1 및 char signed, 그런 다음 char으로 승격 int되고 CHAR_MAX == INT_MAX=> CHAR_MAX + 1는 정수 오버플로를 발생시키고 동작은 정의되지 않습니다 .
즉 가능한 결과는 다음과 같습니다.
모든 증분 작업은 c = c + 1, c += 1, c++와 ++c같은 플랫폼에서 동일한 부작용을 가지고있다. 표현식의 평가 된 값은 증분 이전의 c++값입니다 c. 다른 세 개 c는 증분 후 값이 됩니다.