这个开关块是如何执行的?

时间:2016-11-23 12:56:27

标签: c++ linux g++

#include<bits/stdc++.h>
using namespace std;

void show(int errorCause)
{
    switch(errorCause)
    {
        case 1:
        {
            cout<<"in 1\n";
            break;
        }

        case 2: break;

        case 3:
        {
            cout<<"in 3\n";
            break;

            case 4: 
            {
                cout<<"in 4\n";
                case 5: cout<<"in 5\n";
                    break;
            }
        }
        break;

        default: 
        {
            cout<<"in deafult\n";
            break;
       }
    }
    return;
}

int main()
{
    show(5);
    return 0;
}

我使用了这个代码示例,我无法弄清楚它的流程。据我所知,它应该与默认条件匹配,因为errorCause与任何东西都不匹配,但它的输出是:

in 5

我不明白为什么它不会违约?

以下是我的构建环境详细信息:

编译器: g ++版本4.8.4(Ubuntu 4.8.4-2ubuntu1~14.04.3)

系统: Ubuntu 14.04(64位)

5 个答案:

答案 0 :(得分:4)

你传递5,为什么switch语句不能进入'case 5'?

要说清楚:删除switch-block中的所有这些花括号,不需要它们。重新对齐并格式化代码,然后应该清楚。

答案 1 :(得分:2)

$meeting = array(array('start' => '2016-11-14 16:00:00', 'end' => '2016-11-14 16:30:00' ), array('start' => '2016-11-14 16:45:00', 'end' => '2016-11-14 20:00:00' ), array('start' => '2016-11-14 14:00:00', 'end' => '2016-11-14 15:00:00' ), array('start' => '2016-11-14 13:00:00', 'end' => '2016-11-14 14:00:00' ), array('start' => '2016-11-11 15:20:00', 'end' => '2016-11-11 16:00:00' ), array('start' => '2016-11-11 14:00:00', 'end' => '2016-11-11 15:00:00' ), array('start' => '2016-11-07 07:00:00', 'end' => '2016-11-09 15:00:00' ) ); $min = "09:00:00"; $max = "17:00:00"; $start = "2030-01-01 00:00:00"; $end = "2000-01-01 00:00:00"; $free = [['start' => "2000-01-01 00:00:00", 'end' => "2030-01-01 00:00:00"]]; foreach($meeting as $m){ foreach($free as $k=>$f){ if($m['start']>$f['start'] && $m['start']<=$f['end']){ $free[$k]['end'] = $m['start']; if($m['end']<$f['end']) $free[] = ['start'=>$m['end'], 'end'=>$f['end']]; } elseif($m['end']<$f['end'] && $m['end']>$f['start']){ $free[$k]['start'] = $m['end']; } } $start = min($start,$m['start']); $end = max($end,$m['end']); } $begin = new DateTime( $start ); $end = new DateTime( $end ); $interval = DateInterval::createFromDateString('1 day'); $period = new DatePeriod($begin, $interval, $end); $daily_free = []; foreach ( $period as $dt ){ $m = [ 'start'=>date('Y-m-d ',strtotime($dt->format('Y-m-d').' -1 day')).$max, 'end'=>$dt->format('Y-m-d ').$min ]; foreach($free as $k=>$f){ if($m['start']>$f['start'] && $m['start']<=$f['end']){ $free[$k]['end'] = $m['start']; if($m['end']<$f['end']) $free[] = ['start'=>$m['end'], 'end'=>$f['end']]; } elseif($m['end']<$f['end'] && $m['end']>$f['start']){ $free[$k]['start'] = $m['end']; } } } foreach($free as $k=>$f){ $s = explode(" ",$f['start']); $e = explode(" ",$f['end']); if($s[0] == $e[0]){ $daily_free[$s[0]][] = ['start_free'=>$s[1], 'end_free'=>$e[1]]; } } ksort($daily_free); print_r($daily_free); 语句的

case / default标签可能会出现在switch语句中的任何位置,但嵌套的switch语句除外。

这种用法的一个着名示例是Duff's device用于展开循环:

switch

(改编自原文)。

乍一看,这没有任何意义(如果你允许编译器为你展开循环,这有点多余),但它说明void copy(unsigned char *to, const unsigned char *from, size_t count) { size_t n; if (!count) return; n = (count + 7) / 8; switch (count % 8) { case 0: do { *to++ = *from++; case 1: *to++ = *from++; case 2: *to++ = *from++; case 3: *to++ = *from++; case 4: *to++ = *from++; case 5: *to++ = *from++; case 6: *to++ = *from++; case 7: *to++ = *from++; case 1: } while (--n > 0); } } 标签可以或多或少地放置在case声明中你喜欢哪里。

答案 2 :(得分:1)

首先,不要写这样的代码。 &LT g取代;

其次,它到case 5:的原因只是在switch语句中有case 5:。它嵌套在两层花括号中并不重要;它只是跳转到的代码的标签。它不必位于switch语句的外层。

答案 3 :(得分:0)

这是因为实际上switch语句评估是“放松”的,所以括号在那里并不重要。只有case很重要,但您可以通过case直接跳到范围的中间(或者甚至到循环的中间,请参阅Duff's device)。

答案 4 :(得分:0)

因为您传递的值是5,它与switch case参数完全匹配。

案例5:cout&lt;&lt;&#;;在5 \ n&#34 ;;          打破;

如果你想获得默认语句,那么修改main函数,如下所示:

  int main()
{
  show(6);
  return 0;
}

希望这会有所帮助。