Definite Assignment上的Java语言规范一章中,Example 16-2表示


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不是constant expression


常数表达式是表示原始值的表达式
类型或String不会突然完成并且由以下内容组成
仅以下内容:


[...]
引用constant variables (§4.12.4)的简单名称(§6.5.6.1)。






常量变量是基本类型或类型的final变量
用常量表达式(第15.28节)初始化的String


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

07-24 19:07
查看更多