案例的数字前缀为0时,案例如何工作?

Pan*_*apa 0 c switch-statement

我正在研究Ingenico的EDC终端.以下代码存在于先前的实现中.在调试时,我遇到了这块代码,我面临着难以理解的问题.

short bankPEM = 0;
//bankPEM = 41; //Chip
bankPEM = 17; //Swipe
//bankPEM = 801; //Fallback

switch(bankPEM)
{
    case 021: cout<<"021"; break; //Swipe
    case 051: cout<<"051"; break; //Chip
    case 801: cout<<"801"; break; //Fallback
    default: cout<<"Default"; break;
}
Run Code Online (Sandbox Code Playgroud)

bankPEM是一个短变量.我发现下面的执行观察:

  1. 当它包含时41,case 051执行.
  2. 当它包含时17,case 021执行.
  3. 当它包含时801,case 801执行.

我期望代码执行default数字1和2的情况.在这种情况下,任何人都可以显示一些亮点.

我也将代码转换为汇编语言.调试汇编代码后,我将分享我的理解.

提前致谢.

LPs*_*LPs 5

参考c标准

6.4.4.1整数常量

十进制常量以非零数字开头,由一系列十进制数字组成.八进制常量由前缀0组成,可选地后跟一个数字0到7的序列.十六进制常量由前缀0x或0X后跟一个十进制数字序列和字母a(或A)到f(或F)分别由值10到15组成.

强调我的

由于显示的代码似乎是你也可以参考c ++ 14

2.13.2整数文字

整数文字是一个没有句点或指数部分的数字序列,可选地分隔单引号,在确定其值时会被忽略.整数文字可以具有指定其基数的前缀和指定其类型的后缀.数字序列的词汇第一个数字是最重要的.二进制整数文字(基数为2)以0b或0B开头,由一系列二进制数字组成.八进制整数文字(基数为8)以数字0开头,由一系列八进制数字组成.十进制整数文字(十进制)以0以外的数字开头,由一系列十进制数字组成.十六进制整数文字(基数为16)以0x或0X开头,由十六进制数字序列组成,包括十进制数字和字母a到f和A到F,十进制值为十到十五.[例子:12号可以写成12,014,0XC或0b1100.文字1048576,1'048'576,0X100000,0x10'0000和0'004'000'000都具有相同的值. - 结束例子]

强调我的