官术网_书友最值得收藏!

The switch statement

Conditionals such as the switch statement use the same logic as shown:

switch (age) {
case 18:
can_drink = false;
can_code = true;
break;
case 21:
can_drink = true;
can_code = true;
break;
default:
can_drink = false;
}

Let's suppose rax represents the age, rbx represents can_drink, and rdx represents  can_code. The preceding example will translate into the following assembly instructions (simplified to express the basic idea):

cmp rax, 18
je CASE_18
cmp rax, 21
je CASE_21
je CASE_DEFAULT
CASE_18:
mov rbx, 0; cannot drink
mov rdx, 1; can code
jmp BEYOND_SWITCH; break
CASE_21:
mov rbx, 1
mov rdx, 1
jmp BEYOND_SWITCH
CASE_DEFAULT:
mov rbx, 0
BEYOND_SWITCH:
; ....

Each break statement translates into jumping to the BEYOND_SWITCH label, so if we forget the break keyword, for example, in the case where age is 18, the execution will reach through  CASE_21 as well. That's why you should not forget the break statement.

Let's find a way to avoid using conditionals in the source, both to make the code shorter and possibly faster. We will use function pointers.

主站蜘蛛池模板: 分宜县| 礼泉县| 富顺县| 桦甸市| 昌宁县| 申扎县| 高淳县| 崇文区| 长岭县| 潞西市| 独山县| 红河县| 望奎县| 阜平县| 丹江口市| 金川县| 永康市| 娄底市| 闵行区| 宁津县| 杨浦区| 鲁甸县| 肃宁县| 四川省| 榆中县| 辛集市| 新建县| 太康县| 龙游县| 吴川市| 镇江市| 梨树县| 额敏县| 西林县| 宕昌县| 嘉善县| 九寨沟县| 高雄市| 镇宁| 伊金霍洛旗| 淳安县|