【发布时间】:2021-06-24 09:45:47
【问题描述】:
在下面的代码中发现了一个错误,它解析 C-string 并且应该检测 UTF8 字符:
char* pTmp = ...;
...
switch (*pTmp)
{
case 'o':
{
... // works fine
break;
}
case 0xC2:
{
... // never gets triggered
break;
}
}
但是case 0xC2: 永远不会被触发。
我的假设是 0xC2 被认为是 int,因此是 194,它大于 char 数据类型的最大值 127。所以-62 != 194
或者可能这里发生了一些溢出或整数提升。
写switch ((unsigned char)*pTmp) 解决了这个问题。
但我想澄清一下这里到底发生了什么以及应用了哪些规则。
我也愿意更改标题,只是没有更好的想法。
【问题讨论】:
-
case 0xC2:正在与int值十进制196进行比较,但如果char是signed那么就像你说的那样,-62.你可以验证0xC2是键入int和printf("%zu\n", sizeof(0xC2));。另外:注意'o'也是一个int值。 -
从评论中复制粘贴here: "C89 6.1.2.5 "共有三种字符类型,分别指定为 char 、signed char 和 unsigned char 。" C11 6.2.5p15 "这三种类型char、signed char 和 unsigned char 统称为字符类型。" 6.2.5fn45 "char 是与其他两种不同的类型,不兼容""
-
我试图根据您对问题的表述方式给它一个更好的标题。
-
你可以使用一个字符常量
'\xc2',这样它就有一个字符值。
标签: c++ c switch-statement