Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Java语言规范说表达式(n>;2)不是常量表达式?_Java - Fatal编程技术网

为什么Java语言规范说表达式(n>;2)不是常量表达式?

为什么Java语言规范说表达式(n>;2)不是常量表达式?,java,Java,在关于Java语言规范的一章中 Java编译器必须为代码生成编译时错误: { int k; int n = 5; if (n > 2) k = 3; System.out.println(k); /* k is not "definitely assigned" before this statement */ } 即使n的值在编译时已知,原则上 在编译时可以知道,对k的赋值

在关于Java语言规范的一章中

Java编译器必须为代码生成编译时错误:

{
    int k;
    int n = 5;
    if (n > 2)
        k = 3;
    System.out.println(k);  /* k is not "definitely assigned"
                               before this statement */ 
}
即使n的值在编译时已知,原则上 在编译时可以知道,对k的赋值总是 被执行(更恰当地评估)。Java编译器必须运行 根据本节规定的规则。规则承认 只有不变的表达;在本例中,表达式n>2为 不是§15.28中定义的常量表达式。

但是,如果我们看一下§15.28,它说

关系运算符=

可以对常量表达式作出贡献


表达式
n>2
是否为常量表达式?我们如何确定这一点呢?

之所以这样说,是因为
n
不是一个

常量表达式是表示基元值的表达式 键入或键入一个
字符串
,该字符串不会突然完成,并使用 只有以下几点:

  • [……]
  • 引用的简单名称(§6.5.6.1)

常量变量是基本类型或类型的
最终
变量 用常量表达式(§15.28)初始化的字符串


n
不是
final
,因此不是常量变量。因此,它不是一个常量表达式。因此,
n<2
不是一个常量表达式。

您误读了规范的§15.28。该节列出了常量表达式中允许的语言元素。如果表达式在列表中有任何而不是,则它不是一个常量表达式。它并不意味着如果列表中有任何元素存在,那么表达式是常量

从语言规范(添加了强调):

常量表达式是表示原语类型的值或不突然完成的
字符串的表达式,仅使用以下内容组成:
... 等等


表达式
n>2
不是常量表达式,因为
n
未声明
final
,因此
n
不是常量。即使它在代码中该点的值只能是5,也不符合常量的语言定义。(参见第15.28节引用的内容)。

是否为常量表达式?不,所以,局部变量名不是常量变量,我错过了简单名称部分。现在我明白了,thx Sotirios@不,你误解了。问题不在于名称,而是变量不是
final
。因此,任何非final的变量都不是常量变量,对吗?@reinardhz如果它不是
final
,就不能是常量变量。但是还有其他规则来决定一个变量是否是常数变量。这些在JLS链接章节中列出。