Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当案例的编号前面有0时,switch case如何工作?_C_Switch Statement_C++ - Fatal编程技术网

当案例的编号前面有0时,switch case如何工作?

当案例的编号前面有0时,switch case如何工作?,c,switch-statement,c++,C,Switch Statement,C++,我正在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";

我正在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;
}
short bankPEM=0;
//bankPEM=41//炸薯条
bankPEM=17//刷卡
//bankPEM=801//退路
开关(bankPEM)
{
案例021:cout指的是

6.4.4.1整数常量

十进制常数以非零数字开始,由一系列十进制数组成 数字。八进制常数由前缀0(可选)后跟一系列数字组成 仅限数字0至7。十六进制常数由前缀0x或0x组成 由一系列十进制数字和字母a(或a)到f(或f)以及值组成 分别为10至15

重点矿山

正如代码所示,您也可以参考

2.13.2整数文本

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


Emphasis mine

两个数字
021
051
是以字母形式写入的。如果将它们转换为十进制形式,您将得到:

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个基数10=21个基数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;
}
short bankPEM=0;
//bankPEM=41;//芯片
bankPEM=17;//刷卡
//bankPEM=801;//回退
开关(bankPEM){

案例021:可能是八进制……我已经删除了问题的程序集标记,因为站立与程序集无关。如果需要,您可以稍后重新添加。请记住,程序集标记始终带有特定的架构标记(例如x86-64、arm、mips等),可能与