2011-11-30 105 views
5

在下面的代码中开关变量:改变的情况下

int i = 0; 

switch(i) 
{ 
    case 0: 
     cout << "In 0" << endl; 
     i = 1; 
     break; 
    case 1: 
     cout << "In 1" << endl; 
     break; 
} 

会发生什么?它会调用未定义的行为吗?

+0

为什么呢?如果你期待'case 1'被执行,因为你把'i'改成了1,那么也不会发生这种情况,因为一旦'case'结尾处的'break'被执行到达'switch'语句的末尾0“。 – Praetorian

回答

8

没有未定义的行为。但i的值仅在代码达到switch (i)时才被测试。因此case 1:将被跳过(由break;声明)。

switch关键字并不意味着“每当i的值为0/1时运行代码”。这意味着,检查什么i是现在,并基于此运行代码。它不关心未来会发生什么i

事实上,它有时有用的事:

for(step = 0; !cancelled; ++step) { 
    switch (step) 
    { 
     case 0: 
      //start processing; 
      break; 

     case 1: 
      // more processing; 
      break; 

     case 19: 
      // all done 
      return; 
    } 
} 

而改变控制变量中构建时,有限状态机(尽管不是必需的,因为你可以设置next_state里面的一个case块是极为常见之后进行分配state = next_state)。

0

中断在将此开关语句设置为1后,将其设置为1,这是定义的行为,因此它永远不会输入case 1

+2

如果没有“break”,行为仍然会被很好地定义(但不同)。 –

+0

是的,它会通过并打印两者,而与下一个值为情况1的事实无关。 – Joe

1

这里没有问题。达到开关条件时的表达式进行评估。它不一定是一个变量,如果它是变量,可以随后修改,而不会对switch语句的行为产生任何影响。

0

你的输出将是:

“0”,即使您指定的值i = 1,它不会反映出来,因为交换机不重复操作,这是一个时间选择为突破将

使其脱离switch语句。

相关问题