gpt4 book ai didi

c - switch 语句的问题

转载 作者:行者123 更新时间:2023-12-04 10:36:28 24 4
gpt4 key购买 nike

我们通过代码看问题:

code-1

#include <stdio.h>

int main(int argc, char *argv[])
{
int a =1;
switch (a)
{
printf("This will never print\n");
case 1:
printf(" 1");
break;
default:
break;
}
return 0;
}

这里的 printf() 语句永远不会执行 - 参见 http://codepad.org/PA1quYX3 .但是

代码 2

#include <stdio.h>
int main(int argc, char *argv[])
{
int a = 1;
switch (a)
{
int b;
case 1:
b = 34;
printf("%d", b);
break;
default:
break;
}
return 0;
}

这里将声明 int b - 见 http://codepad.org/4E9Zuz1e .

我不明白为什么在代码 1 中 printf() 不执行,但在代码 2 中 int b 将执行。

为什么?

编辑:我得到了 int b;是声明,它在编译时分配内存,所以无论控制流是否到达那里,声明都会完成。

现在看这段代码

#include<stdio.h>

int main()
{
if(1)
{
int a;
}

a =1;
return 0;
}

这里的 int a 仍然在控制流路径中,但这不会编译...为什么?

最佳答案

switch 视为带有标签的 gotogoto 的位置无关紧要,只要变量声明在你使用它的位置之上,你就可以使用它。这部分是因为变量声明不是一个像表达式一样“完成”的可执行语句。该开关几乎等同于:

int a  = 1;

{
if (a == 1) goto case1;
goto defaultcase;

int b;

case1:
b = 34;
printf("%d", b);
goto end;

defaultcase:
goto end;

end:
}

return 0;

gotob 的范围无关。

尝试这样做:

switch (a)
{
int b = 1;
....

在这种情况下,即使声明了b,初始化也会被跳过,因为一个可执行的语句,可以执行也可以不执行。如果您尝试这样做,您的编译器应该会警告您。

关于 if 内的声明(更新问题): 在这种情况下,a 的范围仅限于 if。进入作用域时创建,作用域结束时销毁。

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

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