C-当案例编号为0时,开关案例如何工作



我正在处理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;
}

bankPEM是一个简短的变量。我在出现观察下发现:

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

我希望该代码将执行default案例1&amp;2。任何人都可以在这种情况下显示一些灯光。

我还将代码转换为汇编语言。在调试组装代码后,我将分享我的理解。

预先感谢。

参考C标准

6.4.4.1整数常数

十进制常数以非零数字开头,由十进制序列组成数字。一个八个常数由前缀0组成,然后是一个序列数字0至7。十六进制常数由前缀0x或0x组成通过一系列十进制数字和字母A(或a(通过f(或f(,具有值分别为10到15。

强调矿山

如显示的代码,您也可以参考C 14

2.13.2整数文字

整数文字是没有周期或指数部分的数字序列,可选分隔单个确定其值时被忽略的引号。整数字面形式可能具有指定其基础的前缀和指定其类型的后缀。数字序列的词汇第一位数是最重要的。二进制整数文字(基二(以0b或0b开头,由一系列二进制数字组成。八分之一整数文字(基数八(从数字0开始,由一系列八达数字组成。十进制整数文字(基本十(始于0以外的数字,由一系列十进制数字组成。A十六进制整数字面字面(16个基础(以0x或0x开头,由一系列十六进制组成数字,其中包括小数位数和字母a通过f和f和f的字母,并具有小数为十进制值十到十五。[示例:十二个数字可以写为12、014、0XC或0B1100。文字1048576、1’048’576、0x100000、0x10'0000和0’004’000’000的价值相同。 - 结束示例]

强调矿山

两个数字 021051以八进制编写。如果将它们转换为十进制形式,您将获得:

21 (base 8) = 1 * 8^0 + 2 * 8^1 = 1 + 16 = 17 (base 10)
51 (base 8) = 1 * 8^0 + 5 * 8^2 = 1 + 40 = 41 (base 10)

所以,我想您现在明白了为什么当bankPEM为17时,执行case 021,并且在执行41时,case 051被执行。

我不明白为什么实施代码的人决定这样写开关案例(这甚至不一致,因为第三种情况在基本10中有一个数字(。

如果在零之前声明,则问题在零之前为零,以使认为这是一个八分音号码021,因此17 base 10 = 21 base 8因此,案例021的执行:对于41来说是相同的基础10 = 51基础8.

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

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

我希望这会有所帮助。

最新更新