1
1027
|
2
272
这个问题
增加一个额外的
|
3
130
好啊。仅仅是澄清这一点与声明没有任何关系。它只涉及“跳过初始化”(ISO C++ 03’6.7/3)。 这里有很多帖子提到,跳过声明可能导致变量“未声明”。这不是真的。可以在没有初始值设定项的情况下声明pod对象,但它将具有不确定的值。例如:
如果对象是非pod或聚合,编译器将隐式添加初始值设定项,因此无法跳过此类声明:
此限制不限于switch语句。使用“goto”跳过初始化也是一个错误:
一个琐事是C和C.在C中的区别,跳过初始化不是一个错误。 正如其他人提到的,解决方案是添加一个嵌套的块,这样变量的生存期就只限于单个case标签。 |
4
35
整个switch语句在同一范围内。要绕过它,请执行以下操作:
注释 括号。 |
5
27
在阅读了所有的答案和更多的研究之后,我得到了一些东西。
在C中,根据规范, _6.8.1标签声明:
在C语言中,没有任何子句允许使用“带标签的声明”。这只是语言的一部分。 所以
这个 不编译 见 http://codepad.org/YiyLQTYw . GCC给出了一个错误:
偶数
这是 也不编译 见 http://codepad.org/BXnRD3bu . 这里我也得到同样的错误。 在C++中,根据规范, 允许标记声明,但不允许标记-初始化。 见 http://codepad.org/ZmQ0IyDG . 这种情况的解决办法是两个
switch语句还有其他一些内容 不要在开关中写入任何不属于任何标签的语句,因为它们永远不会执行:
|
6
20
你不能这样做,因为
这一点最清楚地体现在 Duff's device . 以下是维基百科的一些代码:
注意如何
如其他几张海报所示,您需要自己放一块:
|
7
16
到目前为止,大多数回复都是错误的:你 可以 在case语句后声明变量,但是 不能 初始化它们:
如前所述,解决这个问题的一个好方法是使用大括号为您的案例创建一个范围。 |
8
12
我最喜欢的邪恶转换技巧是使用if(0)跳过不需要的case标签。
但非常邪恶。 |
9
10
试试这个:
|
10
7
可以在switch语句中声明变量 如果 启动新块:
原因在于在堆栈上分配(和回收)空间来存储局部变量。 |
11
6
考虑:
在缺少break语句的情况下,有时newval会被声明两次,直到运行时才知道它是否声明。我想限制是因为这种混乱。纽瓦尔的范围是什么?约定要求它是整个交换块(在大括号之间)。 我不是C++程序员,但在C语言中:
工作良好。在开关块中声明变量是可以的。在案件警卫之后声明不是。 |
12
4
开关的整个部分是一个声明上下文。不能在这样的case语句中声明变量。试试这个:
|
13
3
如果您的代码说“int newval=42”,那么您可以合理地期望newval永远不会未初始化。但是,如果您继续阅读这个语句(这就是您正在做的),那么这就是所发生的事情——newval在作用域中,但尚未被分配。 如果这是您真正想要发生的事情,那么语言需要通过说“int newval;newval=42;”来明确地表达出来。否则,您可以将newval的范围限制为单个案例,这更可能是您想要的。 如果您考虑相同的例子,但“const int newval=42;,它可能会澄清一些问题。 |
14
3
我只是想强调一下 苗条的 的 point . switch构造创建了一个完整的、一流的公民范围。因此,可以在switch语句中的第一个case标签之前声明(并初始化)变量, 没有 附加支架对:
|
15
3
到目前为止,答案都是针对C++的。 对于C++,不能跳过初始化。您可以在C语言中使用。但是,在C语言中,声明不是语句,并且case标签后面必须跟着语句。 所以,有效的(但丑陋的)C,无效的C++
相反,在C++中,声明是一个语句,所以下面是有效的C++,无效的C
|
16
3
有趣的是这很好:
…但事实并非如此:
我知道修复是足够简单的,但是我还不理解为什么第一个示例不会影响编译器。如前所述(2年前和合) 宣言 并不是导致错误的原因,即使是在逻辑上。初始化是问题所在。如果变量已初始化并在不同的行上声明,则它将编译。 |
17
3
我发自内心地写这个答案是为了 this question . 但是当我完成它时,我发现答案已经关闭了。所以我把它贴在这里,也许喜欢引用标准的人会发现它很有用。 有问题的原始代码:
实际上有两个问题:
1。为什么我可以在后面声明一个变量
这是因为C++中的标签必须是: N337 61/1
而在
N33 37 6/1:
2。为什么我可以跳过变量声明然后使用它? 因为: N33 37 6 7/3
自从
但是,如果
|
18
1
新变量只能在块范围内去标记。你需要这样写:
当然,newval只在大括号内有作用域… 干杯,拉尔夫 |
19
1
一
考虑这个
这可能令人惊讶,但编译器不会将其视为简单的
这个
这可能看起来很奇怪,但需要支持
坠落
(也就是说,不使用
|
20
0
newval存在于开关的整个范围内,但仅在命中val分支时初始化。如果在VAL中的代码周围创建一个块,它应该是正常的。 |
21
0
C++标准有: 可以转换到块中,但不能以通过初始化绕过声明的方式进行。一种程序,从具有自动存储时间的局部变量不在作用域内的点跳到它在作用域内的点是不正确的,除非该变量具有pod类型(3.9),并且声明时没有初始值设定项(8.5)。 用于说明此规则的代码:
显示初始值设定项效果的代码:
|
22
-1
我认为目前的问题是,该语句被跳过,而您试图在其他地方使用var,它将不会被声明。 |
23
-1
似乎匿名对象 可以 在switch case语句中声明或创建,原因是它们不能被引用,因此不能进入下一个case。考虑到这个例子编译在GCC4.5.3和Visual Studio 2008上(可能是一个合规性问题,所以专家们请参与进来)
|
rookie · 检查函数模板的所有参数包参数是否属于int 1 年前 |
ivaigult · -W转换和隐式字符串到布尔类型转换 1 年前 |
rainer · 后台插入程序的初始化 1 年前 |
Community wiki · 以理智、安全和高效的方式复制文件 1 年前 |
Shefali Kanaujia · 对C中向量的向量进行排序++ 1 年前 |
Ma Joonyoung · 粗粒度和细粒度链表的时间比较 1 年前 |