我对Java开关有一个疯狂的问题。
int key = 2;
switch (key) {
case 1:
int value = 1;
break;
case 2:
value = 2;
System.out.println(value);
break;
default:
break;
}
方案1-当key
为2时,它成功地将值打印为2。
方案2-当我要在其中注释value = 2
时case 2:
,saying地说 “本地变量值可能尚未初始化” 。
问题:
场景1:如果执行流程没有转到case 1:
(当时key = 2
),那么它如何知道value变量的类型为int
?
方案2:如果编译器将value变量的类型识别为int
,则它必须已访问。(声明和初始化)中的int value = 1;
表达式case 1:
。那为什么它会吱吱作响?当我要发表评论value = 2
时case 2:
,说 本地变量值可能没有初始化 。
基本上,switch语句的作用域很奇怪。从JLS的6.3节开始:
块中的局部变量声明的范围(第14.4节)是该声明在其中出现的其余部分,从其自身的初始化程序开始,并在局部变量声明语句的右侧包括其他任何声明符。
在您的情况下,即使永远不会执行,它也与它case 2
位于同 一块中 ,case 1
并在其后出现case 1
……因此,即使您从逻辑上也从未“执行”该声明,该局部变量仍在范围内并且可用于 编写 。(尽管声明是初始化的,但它并不是真正的“可执行文件”。)
如果您注释掉该value = 2;
赋值,编译器仍会知道您所指的是哪个变量,但是您将不会经历任何为其赋值的执行路径,这就是为什么您尝试执行此操作时会收到错误的原因读取其他任何未明确分配的局部变量。
我强烈建议您 不要 使用在其他情况下声明的局部变量-如您所见,这会导致代码非常混乱。当我在switch语句中引入局部变量时(我很少尝试这样做-
理想情况下,情况应该很短),我通常更喜欢引入新的作用域:
case 1: {
int value = 1;
...
break;
}
case 2: {
int value = 2;
...
break;
}
我相信这很清楚。
本文向大家介绍tensorflow 声明和初始化可变张量,包括了tensorflow 声明和初始化可变张量的使用技巧和注意事项,需要的朋友参考一下 示例 当值需要在会话中更新时,使用可变张量。这是在创建神经网络时将用于权重矩阵的张量类型,因为这些值将在训练模型时更新。 可以使用或函数声明可变张量。建议使用,因为它提供了更大的灵活性,例如:tf.Variable()tf.get_variable()
7.1.1 概念 数组是具有相同 唯一类型 的一组已编号且长度固定的数据项序列(这是一种同构的数据结构);这种类型可以是任意的原始类型例如整型、字符串或者自定义类型。数组长度必须是一个常量表达式,并且必须是一个非负整数。数组长度也是数组类型的一部分,所以[5]int和[10]int是属于不同类型的。数组的编译时值初始化是按照数组顺序完成的(如下)。 注意事项 如果我们想让数组元素类型为任意类型的话
问题内容: 嗨,我在使用Java进行初始化时遇到问题,以下代码给了我一个编译错误,叫做:Expected instanceInt = 100; 但我已经宣布了 如果这些东西与堆栈和堆的东西有关,请用简单的术语进行解释,我是Java的新手,并且我对这些领域不了解。 问题答案: 您不能在课程中间使用语句。它必须与声明位于同一块或同一行中。 做您想要的事情的常用方法是: 声明期间的初始化 } 通常,如果
问题内容: 如何在Java中声明和初始化数组? 问题答案: 你可以使用数组声明或数组文字(但只有当你立即声明并影响变量时,数组文字才能用于重新分配数组)。 对于原始类型: 例如,对于类,String是相同的: 当你首先声明数组然后对其进行初始化时,第三种初始化方法很有用。
如何在Java中声明和初始化数组?
8.1.1 概念 map 是引用类型,可以使用如下声明: var map1 map[keytype]valuetype var map1 map[string]int ([keytype] 和 valuetype 之间允许有空格,但是 gofmt 移除了空格) 在声明的时候不需要知道 map 的长度,map 是可以动态增长的。 未初始化的 map 的值是 nil。 key 可以是任意可以用 ==