所以我在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
为什么?
答案 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但是因为函数正在进行递归,它不应该首先跟随递归吗?
你对程序的控制流程是正确的。但是,让我们一步一步看看会发生什么。
function
的{{1}}。2
。当函数到达function
时,它会以参数case 2
递归地再次调用自身。 1
到达function
,它匹配,并按照里面的说明进行操作。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中终止并移动代码中的其他步骤。