我正在使用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;
}
是一个短变量。我发现下面的执行观察:
bankPEM
,则会执行41
。case 051
,则会执行17
。case 021
,则会执行801
。我希望代码执行case 801
的情况为1号&amp; 2。
在这种情况下,任何人都可以表现出一些亮点。
我也将代码转换为汇编语言。调试汇编代码后,我将分享我的理解。
提前致谢。
答案 0 :(得分:5)
6.4.4.1整数常量
十进制常量以非零数字开头,由十进制序列组成 数字。 八进制常量由前缀0组成,可选地后跟一个序列 仅数字0到7。十六进制常量由前缀0x或0X组成 通过一系列十进制数字和字母a(或A)到f(或F)的值 分别为10到15。
强调我的
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)
这两个数字021
和051
都写在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;
}
我希望这会有所帮助。