当案例的编号前面有0时,switch case如何工作?
我正在Ingenico的EDC终端上工作。以下代码是先前实现中的现有代码。在调试过程中,我遇到了这段代码,我很难理解当案例的编号前面有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";
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等),可能与