必须在C++实现中将字符'0' - '9'设置为具有连续的数值,即:
'0' -> 0+n
'1' -> 1+n
m -> m+n
'9' -> 9+n
Run Code Online (Sandbox Code Playgroud)
我在isdigit([分类](22.3.3.1字符分类))*的文档中找不到它,也不能在语言环境文档中找到它(但也许我看起来不够努力).
在2.3字符集中,我们发现了这一点
基本源字符集由96个字符组成:空格字符,表示水平制表符的控制字符,垂直制表符,换页符和换行符,以及以下91个图形字符
但它没有提到任何顺序(但也许我看起来不够努力).
*:有趣的脚注:
当在循环中使用时,缓存ctype <> facet并直接使用它[而不是isdigit()等,结束注释]或使用ctype <> :: is的向量形式更快.
在代码中,开关用于将字母转换为连续值。优化编译器通常不会像切换前的简单连续数字条件那样完成这项工作。如何检测使用了哪个执行字符集和/或得出结论认为字母是连续的以用简单的条件替换它?
static long digit_value(char c)
{
if (c >= '0' && c <= '9')
return (c-'0');
switch(c) {
case 'a':
case 'A':
return 10;
case 'b':
case 'B':
return 11;
case 'c':
case 'C':
return 12;
case 'd':
case 'D':
return 13;
case 'e':
case 'E':
return 14;
case 'f':
case 'F':
return 15;
case 'g':
case 'G':
return 16;
case 'h':
case 'H':
return 17;
case 'i':
case 'I':
return 18;
case 'j':
case 'J':
return 19;
case 'k': …Run Code Online (Sandbox Code Playgroud) 我用c ++编写了一个用于切换案例的程序来理解:
int main()
{
int x = 65;
switch(x)
{
case 'A':printf( "One" );
break;
case 'B': printf( "Zero" );
break;
case 'C': printf( "Hello World" );
break;
default: printf("Invalid");
}
}
Run Code Online (Sandbox Code Playgroud)
我的困惑是我宣布了我的 int x = 65
并且此代码的输出是
One
Run Code Online (Sandbox Code Playgroud)
这怎么可能?为什么它与ASCII值有关65?