我在代码审查过程中发现了一些令人困惑的代码,我有点困惑。做了一些研究我发现了这种情况。我写了这个代码示例来突出问题
char d = '©';// this is -87,the copyright symbol , (actually its 169 unsigned)
if(ispunct(d)) // will assert.
{
}
所以,修复bug的程序员做了以下事情:
char d = '©';// this is -87,the copyright symbol , (actually its 169 unsigned)
if(ispunct((unsigned char)d)) // will not assert, because it will be 169.
{
}
我的问题是,char
无符号是否可行?理想情况下,我不会使用char
但使用Unicode字符来避免这类问题,但软件很老,不会很快重新设计。
我正在使用Visual Studio 2008. ispunct()
可以找到ctype.h
。
答案 0 :(得分:7)
在这种情况下演员是正确的。来自man ispunct
:
ispunct()
函数测试除空格外的任何打印字符 (' '
)或isalnum(3)
为true
的字符。的价值 参数必须可以表示为unsigned char
或EOF
的值。
答案 1 :(得分:3)
如果你想使用ispunct
,那么就无法解决它。
_ASSERTE((unsigned)(c + 1) <= 256);
这就是导致断言失败的原因,因此演员阵容是合适的。
答案 2 :(得分:2)
进行演员表演是完全合法的。我相信C变量默认是签名但是强制转换使它可用。