参与数值运算的 char 对象应显式声明 signed 或 unsigned
10.2.6 ID_plainNumericChar
char 类型是否有符号由实现定义,未显式声明 signed、unsigned 的 char 对象不应被当作整数使用。
注意,char 和 signed char、unsigned char 是三种不同的类型,signed char、unsigned char 应被当作整数类型,而 char 应被当作字符类型,不应使用整数对 char 对象赋值,也不应使 char 对象参与和字符无关的算术、比较或位运算等数值运算。
虽然字符类型由整数类型实现,但应分清各自的职责,混用不利于阅读和维护,char、wchar_t、char16_t、char32_t 均不应被当作整数使用。
示例:
int foo(char c) { // Compliant
return c == 'a';
}
int bar(char c) { // Non-compliant
return c >= 0; // May be always true
}
例中 foo 函数的 char 型参数只与字符有关,可不必声明符号属性,而 bar 函数的参数被当作整数参与了比较运算,应显式声明 signed,否则在 char 为无符号整型的环境中会得到错误的结果。
应改为:
int bar(signed char c) { // Compliant
return c >= 0;
}
相关
依据
ISO/IEC 9899:1999 6.2.5(3 15)-implementation
ISO/IEC 9899:2011 6.2.5(3 15)-implementation
ISO/IEC 14882:2003 3.9.1(1)-implementation
ISO/IEC 14882:2011 3.9.1(1)-implementation
参考
MISRA C++ 2008 5-0-11
SEI CERT INT07-C