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

时间:2017-04-26 09:52:34

标签: c switch-statement

我正在使用Ingenico的EDC终端。以下代码存在于先前的实现中。在调试过程中,我遇到了这段代码,我遇到了难以理解的问题。

select     main_id, sub1_data, sub2_data
from       (select main_id, array_agg(sub1_data) sub1_arr from sub1 group by main_id) s1
full join  (select main_id, array_agg(sub2_data) sub2_arr from sub2 group by main_id) s2 using (main_id)
cross join unnest(sub1_arr, sub2_arr) u(sub1_data, sub2_data)

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; } 是一个短变量。我发现下面的执行观察:

  1. 如果包含bankPEM,则会执行41
  2. 如果包含case 051,则会执行17
  3. 如果包含case 021,则会执行801
  4. 我希望代码执行case 801的情况为1号&amp; 2。 在这种情况下,任何人都可以表现出一些亮点。

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

    提前致谢。

3 个答案:

答案 0 :(得分:5)

参考c standard

  

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都具有相同的值。 - 结束例子]

强调我的

答案 1 :(得分:3)

这两个数字021051都写在octal form中。如果将它们转换为十进制形式,您将获得:

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被执行。

我不明白为什么实施代码的人决定写这样的开关案例(它不是一致的,因为第3个案例的基数为10)。

答案 2 :(得分:1)

问题在零之前的情况下,在零使编译器之前的情况下认为它是一个八进制数021因此17基10 = 21基8因此执行情况021:同样适用于41基10 = 51基8。 / p>

 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;
}

我希望这会有所帮助。