如果你有“128 + 7 - i”(其中i被声明为整数变量),它是一个常量表达式吗?为什么或为什么不呢?
答案 0 :(得分:3)
我会说这不是因为我是变量,所以,当你用变量做数学时,结果不能是常数。
答案 1 :(得分:3)
这取决于声明i
的位置,以及编译器是否可以弄清楚,是否有可能在运行时更改它。
例如,如果您的代码如下所示:
...
int i = 3;
int x = 128 + 7 - i;
...
编译器可以理解,i
在表达式中使用之前无法改变。在这种情况下,它可以在编译时作为常量表达式内联。
但是,如果是这样的话:
-(void) doSomething:(int) i {
...
int x = 128 + 7 - i;
...
}
值可能会在运行时更改,具体取决于方法参数,在这种情况下,它可能不会为编译器保持不变。
请注意,编译器是否可以执行上述优化,取决于编译器的设置。例如,在调试版本中,它肯定不会这样做。
编辑:正如Rudy Velthuis在评论中正确指出的那样,我的回答有点太快了。实际上,第一个例子实际上并不是一个常量表达式,编译器会(非常明确地)确实告诉你。我没有考虑到常量表达式是一个具有明确定义的固定术语(例如,参见Java语言规范here,现在没有方便的C版本)。相反,我把它与编译器优化技术混淆,后者通过方法内的数据流分析,允许它用常数值替换上述代码。