c语言中的开关盒检测

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); } 当然,这非常简单,但我不明白这一点。 当代码执行

所以我在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中时,因为没有
中断它将转到案例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)
返回时会发生什么?什么“输出”?请粘贴整个相关代码。没有相关代码。就是这样,我只是凭记忆写的。好的,谢谢大家的回答,我现在明白了,既然你们都是正确的,让我明白了,我就接受投票最多的那个。也许我是个白痴,没有坚持到底:波普显然是个傻瓜