为什么C ++在switch语句中需要中断?
这个问题在这里已经有了答案:
这是为了“跌宕起伏”的情况:
switch (x)
{
case 0:
case 1:
std::cout << "x is 0 or 1." << std::endl;
break;
}
在这个例子中,如果x是0或1,case语句被执行。
这是因为switch val
会被转换为程序集跳转到特定地址case (some value):
是,那么CPU将继续正常执行代码,因此要获取下一个地址并继续,然后取下并继续, case
块在内存中的连续地址中,因此执行将会通过。 break;
会告诉CPU再次跳转,这次超出switch-case块不会执行任何更多case
。
通过跌倒可能是受益人,并且在一些更新的语言中,您必须明确地说您想要它,在C和C ++中,通过是隐含的。
来自我的机器的示例:
int i=1;
switch (i) {
case 1:
i=5;
break;
default:
i=6;
}
return 0;
会变成
0x100000eeb: movl $0x1, -0x8(%rbp) ;int i=1;
0x100000ef2: xorl %eax, %eax
0x100000ef4: movb %al, %cl
0x100000ef6: testb %cl, %cl ;switch(i)
0x100000ef8: jne 0x100000f0f ;i is not 1 go to default:
0x100000efe: jmp 0x100000f03 ;i is 1 go to case 1:
0x100000f03: movl $0x5, -0x8(%rbp) ;case 1: i=5;
0x100000f0a: jmp 0x100000f16 ;break;
0x100000f0f: movl $0x6, -0x8(%rbp) ;default: i=6;
0x100000f16: movl $0x0, %eax ;first instruction after switch-case
如果在i=5;
之后没有跳转i=5;
那么CPU将执行default:
因为行为是从C继承而来的,C使用了明确的break
。 开关贯穿性更有用,这就是为什么它被选为“默认”行为的原因。
只有更多的程序员时间和更少的机器时间,所以设计最大潜在效率而不是可读性更有意义。 编译器在很多方面优化功耗要低很多(在许多方面)。 您可以查看Duff's Device之类的内容,以了解如何使用此行为。
链接地址: http://www.djcxy.com/p/84475.html