if (skb_cow(skb, skb_headroom(skb)))
goto drop;
iph = skb->nh.iph;
if (ip_options_compile(NULL, skb))
goto inhdr_error;
/*.......*/ //非常多的和我们的主题无关的代码
inhdr_error:
IP_INC_STATS_BH(IpInHdrErrors);
drop:
kfree_skb(skb);
return NET_RX_DROP;
这段代码是linux2.4内核源码中对于数据包的接收的一段代码。我们可以用case的想法改写他:
bool y_or_n;
switch (y_or_n)
{
y_or_n = skb_cow(skb, skb_headroom(skb)))
case true:
goto drop;
iph = skb->nh.iph;
y_or_n = ip_options_compile(NULL, skb))
case true:
goto inhdr_error;
/*.......*/ //非常多的和我们的主题无关的代码
inhdr_error:
IP_INC_STATS_BH(IpInHdrErrors);
drop:
kfree_skb(skb);
return NET_RX_DROP;
不知道我的改写对于原来的意思会不会发生改变。总之就是,如果没有遇到break,将继续运行,并且匹配下一个case,在有时候你有这个目的的时候,可以这么用。如果你觉得上面的太难懂,我再举一个例子:
switch(楼主)
{
case 人:
//do something;
case 猪:
//do nothing;
case 超人:
//do everything;
}
懂了吧?就是第三个条件是第一个条件的子集,超人也是人。如果楼主你是超人,那么你可以做某些事,也可以做任何事。
你的程序等同于
switch(4)
{
case 1:
printf("A
");
case 3:
printf("B
");
}
return 0;
switch((int)(2.0+2.5)) 中,int是显式强制转换的标志,switch后面的括号里,不但接受变量,而且接受常量。case语句来匹配他们是否相等。
不管是2.0+2.5还是1+2,都会在语句中先被算出来,这要联系到编译器的优化问题,有的编译器,比如gcc,会在编译的时候优化1+2为3。不过就算没有优化功能的编译器,在运行的时候,表达式1+2也会在出栈的时候被计算成返回值,再放到外面的语句里计算。这要牵涉到表达式的解释,栈的原理,很复杂,一时半会说不清楚。