c语言中的开关盒检测
所以我在c中使用switch case时遇到了这个非常简单的问题,我想对此进行一些解释c语言中的开关盒检测,c,switch-statement,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); } 当然,这非常简单,但我不明白这一点。 当代码执行
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中时,因为没有中断代码>它将转到案例3,但是既然函数正在执行递归,那么它不应该首先遵循递归吗
因此,不,它不会,输出为:
-1
虽然我以为会是:
1
这是为什么?程序控制流与您认为的一样-它确实执行一个递归调用,同时运行案例1:
。但是您正在丢弃案例2:
中返回的值。然后,程序控制运行到情况3:
,并返回该结果
如果你写信的话,事情就不一样了
案例2:返回函数(x-1)代码>
相反。程序控制流是您认为应该的-它确实执行一个递归调用,此时运行案例1:
。但是您正在丢弃案例2:
中返回的值。然后,程序控制运行到情况3:
,并返回该结果
如果你写信的话,事情就不一样了
案例2:返回函数(x-1)代码>
相反
当然,这非常简单,但我不明白这一点。当代码执行并进入案例2中时,因为没有中断;它将转到案例3,但是既然函数正在执行递归,那么它不应该首先遵循递归吗
关于程序的控制流,您是对的。但让我们一步一步地看看会发生什么
- 首先,我们有一个main函数,用值
2
调用函数
- 然后进入
函数
。当函数到达情况2
时,它会使用参数1
再次递归调用自身李>
- 被调用的函数
函数
到达它匹配的情况1
,并遵循其中的说明
- 因此,被调用的函数
函数
返回一个值1
,而不发生任何其他情况李>
- 因此,
函数
将继续执行情况3
(因为没有您也指出的中断
语句),并将打印-1
当然,这非常简单,但我不明白这一点。当代码执行并进入案例2中时,因为没有中断;它将转到案例3,但是既然函数正在执行递归,那么它不应该首先遵循递归吗
关于程序的控制流,您是对的。但让我们一步一步地看看会发生什么
- 首先,我们有一个main函数,用值
2
调用函数
- 然后进入
函数
。当函数到达情况2
时,它会使用参数1
再次递归调用自身李>
- 被调用的函数
函数
到达它匹配的情况1
,并遵循其中的说明
- 因此,被调用的函数
函数
返回一个值1
,而不发生任何其他情况李>
- 因此,
函数
将继续执行情况3
(因为没有您也指出的中断
语句),并将打印-1
调用函数(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
调用函数(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
在使用switch case检查输入的字符是否为元音时,我遇到了类似的问题,在switch case中没有使用break语句
在输出中,它向我显示了两种情况:-
这是一个元音。
它不是元音
后来我发现,如果不使用case编写break语句,编译器将执行所有case,并从开关case终止,然后继续执行代码中的后续步骤。我在使用开关case检查输入的字符是否为元音时遇到了类似的问题,在开关情况下不使用break语句
在输出中,它向我显示了两种情况:-
这是一个元音。
它不是元音
后来我发现,如果不使用cases编写break语句,编译器将执行所有cases,并从开关cases终止,然后继续执行代码中的后续步骤。您能告诉我们实际的函数调用吗?是的,它遵循递归,但是调用函数(x-1)时会发生什么
返回?什么“输出”?请粘贴整个相关代码。没有相关代码。就是这样,我只是凭记忆写的。好的,谢谢大家的回答,我现在明白了,既然你们都是正确的,让我明白了,我就接受投票最多的那个。也许我是个白痴,没有做到:你能给我们展示实际的函数调用吗?是的,它遵循递归,但是当调用函数(x-1)
返回时会发生什么?什么“输出”?请粘贴整个相关代码。没有相关代码。就是这样,我只是凭记忆写的。好的,谢谢大家的回答,我现在明白了,既然你们都是正确的,让我明白了,我就接受投票最多的那个。也许我是个白痴,没有坚持到底:波普显然是个傻瓜