在c

时间:2017-01-23 12:06:00

标签: c switch-statement

所以我在c中使用switch case遇到了这个非常简单的问题,我想对它进行一些解释。

int function(int x)
{
    switch(x)
    {
        case 1: return 1;
        case 2: function(x-1);
        case 3: return -1;
    }
}

int main(){
    int x = 2;
    function(x);
}

当然它非常简单,但我没有得到的是这个。 当代码执行并进入案例2时,由于没有break;,它将转到案例3 BUT ,因为函数正在进行递归不应该首先跟随递归通过?

所以不,它没有,输出是:

-1

虽然我认为会是:

1

为什么?

4 个答案:

答案 0 :(得分:4)

当您致电function(2)时,您确实进行了递归调用,但此值从未使用过。因此,switch语句将继续执行第三种情况,即返回-1

事件的顺序是:

// first function call
case 2: function(1);   // recursive call

// inside recursive call
case 1: return 1;      // return 1

// back in first function call
case 3: return -1;     // return -1 to the caller, having ignored the return
                       // value from case 2

答案 1 :(得分:2)

  

当然它非常简单,但我没有得到的是这个。当代码执行并进入案例2时,因为没有中断;它将转到案例3但是因为函数正在进行递归,它不应该首先跟随递归吗?

你对程序的控制流程是正确的。但是,让我们一步一步看看会发生什么。

  • 首先,我们有main函数,调用值为function的{​​{1}}。
  • 然后我们进入2。当函数到达function时,它会以参数case 2递归地再次调用自身。
  • 被调用函数1到达function,它匹配,并按照里面的说明进行操作。
  • 因此调用ed函数case 1 返回 function,而不会发生任何其他事情。
  • 因此,1将继续function(因为您还指出了没有case 3声明)并将打印break

答案 2 :(得分:1)

程序控制流,你认为它应该是 - 它执行一次递归调用,当时运行case 1:。但是您丢弃来自return的{​​{1}}值。程序控制然后运行到case 2:,返回结果。

如果你写了

,那将是另一回事

case 3:

代替。

答案 3 :(得分:-2)

当我使用switch case来检查输入的字符是否是元音时遇到了类似的问题,而没有在switch case中使用break语句。

在输出中,它向我展示了两种情况: - 这是一个元音。 它不是元音

后来我发现如果你没有用case编写break语句,那么编译器将执行所有的情况并从switch case中终止并移动代码中的其他步骤。