gpt4 book ai didi

c - switch 语句中的声明

转载 作者:太空狗 更新时间:2023-10-29 15:23:32 24 4
gpt4 key购买 nike

考虑这个 C 代码,其中 foo 是一个 int:

switch(foo){
case 1: {
int bla = 255;
case 2:
printf("case12 %d\n", bla);
break;
case 3:
printf("case3 %d\n", bla);
}
};

对于 foo 的不同值,代码给出以下输出:

case12 255   # foo=1
case12 255 # foo=2
case3 0 # foo=3

我在理解 foo=3 时遇到问题。当 foo=3 时,声明 bla 并定义其值的行不应执行。 switch 语句应该直接跳转到 case 3: 的标签。然而没有警告,所以 bla 似乎至少已经被声明了。它可能会在未初始化的情况下使用,但它的值恰好是 0。您能解释一下“案例 3”中发生了什么,以及为什么这是合法的 C 代码吗?

最佳答案

switch 语句本质上是一个计算的gotocase 标签可以出现在由 switch 控制的(通常是复合的)语句中的任何位置,甚至在嵌套 block 中也是如此。

声明 int bla = 255; 创建一个 int 对象 bla 其生命周期是封闭 block 的执行并且其名称是可见的从它的声明点到 block 的末尾。

如果 switch 语句导致控制跳转到 case 2:case 3: 标签,则跳转到 bla 但会跳过 其初始化。 bla 的值是垃圾(不是随机的,不一定是 0),实际上试图引用它的值有未定义的行为。

你可以用 goto 语句做同样的事情

不要那样做。

(对于 gcc,如果您使用 -Wall-Wextra-Wmaybe-uninitialized 进行编译,您将收到警告.)

(对于 switch 语句的另一种滥用,请参阅 Duff's Device。)

关于c - switch 语句中的声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38809665/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com