이 질문은 unsigned Char로 캐스팅해야 한다는 제안에서 비롯되었습니다. char은 std::toupper 및 std::tolower와 같은 문자 조작 함수를 호출하기 전에 필요합니다. 그러나 Bjarne Stroustrup의 코드는 캐스팅 없이 이러한 함수를 사용하는 것으로 보입니다.
Char 표현
Char, signed char 및 unsigned char은 C에서 고유한 유형입니다. Char는 signed char 또는 unsigned char에 해당하는 범위를 나타낼 수 있습니다. char이 서명된 시스템에서 전체 문자 집합은 음수가 아닌 값을 갖습니다.
toupper 함수
C 표준에 따르면 toupper는 int 인수를 허용하고 반환합니다. 정수 결과. 입력 값은 부호 없는 문자로 표현 가능하거나 EOF와 동일해야 합니다. 그렇지 않은 경우 동작은 정의되지 않은 것입니다.
정의되지 않은 동작
일반 문자가 부호 있고 toupper에 전달된 값이 음수인 경우 정의되지 않은 동작이 발생합니다. 이는 int로의 암시적 변환이 음수 값을 생성하기 때문입니다.
Casting to Unsigned Char
char 인수를 unsigned char로 변환하면 값이 음수가 아닌 것이 보장됩니다. , 정의되지 않은 동작을 피합니다. char과 unsigned char는 크기가 같지만 값의 범위가 다릅니다.
구현
이러한 함수는 일반적으로 조회 테이블을 사용하여 구현됩니다. 테이블 경계를 넘어서는 인덱싱은 정의되지 않은 동작으로 이어질 수 있습니다. 결과가 암시적으로 음수 값으로 다시 변환되는 경우 부호 없는 문자로 직접 변환해도 이 문제가 방지되지 않습니다.
예외: EOF
C 수정
C 표준은 특정 C 표준 라이브러리 함수만 수정하며, 기능에 대한 조정은 없습니다.
결론
정의되지 않은 동작을 방지하려면 toupper, tolower 또는 유사 항목을 호출하기 전에 char 인수를 unsigned char로 캐스팅해야 합니다. 함수는 char가 음수가 아닌 부호 있는 유형인 경우에도 마찬가지입니다.
위 내용은 `toupper()`, `tolower()` 등을 사용하기 전에 `unsigned char`로 캐스팅해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!