Objective-C中的常量表达式

Objective-C中的常量表达式,objective-c,Objective C,如果有“128+7–i”(其中i被声明为整数变量),它是常量表达式吗?为什么或者为什么不?我想说,这并不是因为我是一个变量,所以,当你对一个变量进行数学运算时,结果不能是常数。我想说,这并不是因为我是一个变量,所以,当你对一个变量进行数学运算时,结果不能是常数。这取决于I的声明位置,编译器是否能够弄清楚,它是否有可能在运行时被更改 例如,如果您的代码如下所示: ... int i = 3; int x = 128 + 7 - i; ... -(void) doSomething:(int) i

如果有“128+7–i”(其中i被声明为整数变量),它是常量表达式吗?为什么或者为什么不?

我想说,这并不是因为我是一个变量,所以,当你对一个变量进行数学运算时,结果不能是常数。

我想说,这并不是因为我是一个变量,所以,当你对一个变量进行数学运算时,结果不能是常数。

这取决于
I
的声明位置,编译器是否能够弄清楚,它是否有可能在运行时被更改

例如,如果您的代码如下所示:

...
int i = 3;
int x = 128 + 7 - i;
...
-(void) doSomething:(int) i {
    ...
    int x = 128 + 7 - i;
    ...
}
编译器可能会发现,
i
在被用于表达式之前是无法更改的。在这种情况下,它可以在编译时作为常量表达式内联

然而,如果是这样的话:

...
int i = 3;
int x = 128 + 7 - i;
...
-(void) doSomething:(int) i {
    ...
    int x = 128 + 7 - i;
    ...
}
该值可能在运行时发生变化,具体取决于方法参数,在这种情况下,对于编译器来说,它不能是常量

请注意,编译器是否可以像上面描述的那样进行优化取决于编译器的设置。例如,在调试构建中,它肯定不会这样做


编辑:正如鲁迪·维尔修斯在评论中正确指出的那样,我的回答有点太快了。事实上,第一个示例并不是一个常量表达式,编译器会(非常明确地)告诉您。我没有考虑到常量表达式是一个具有明确定义的固定术语(例如,请参阅Java语言规范,目前手头没有C版本)。相反,我把它与编译器优化技术混淆了。编译器优化技术通过方法内部的数据流分析,允许它用一个常量值替换前面提到的代码。

这取决于
I
的声明位置,以及编译器是否能够确定它是否有可能在运行时被更改

例如,如果您的代码如下所示:

...
int i = 3;
int x = 128 + 7 - i;
...
-(void) doSomething:(int) i {
    ...
    int x = 128 + 7 - i;
    ...
}
编译器可能会发现,
i
在被用于表达式之前是无法更改的。在这种情况下,它可以在编译时作为常量表达式内联

然而,如果是这样的话:

...
int i = 3;
int x = 128 + 7 - i;
...
-(void) doSomething:(int) i {
    ...
    int x = 128 + 7 - i;
    ...
}
该值可能在运行时发生变化,具体取决于方法参数,在这种情况下,对于编译器来说,它不能是常量

请注意,编译器是否可以像上面描述的那样进行优化取决于编译器的设置。例如,在调试构建中,它肯定不会这样做


编辑:正如鲁迪·维尔修斯在评论中正确指出的那样,我的回答有点太快了。事实上,第一个示例并不是一个常量表达式,编译器会(非常明确地)告诉您。我没有考虑到常量表达式是一个具有明确定义的固定术语(例如,请参阅Java语言规范,目前手头没有C版本)。相反,我把它与编译器优化技术混淆了。编译器优化技术通过方法内部的数据流分析,允许它用常量值替换前面提到的代码。

试试看:
int I=3;枚举{aaa=128+7-i}检验。编译器将告诉您,
128+7-i
不是整数常量表达式。瞧,包含变量的表达式不是常量表达式(有意义,不是吗?)。FWIW,如果您声明
const int i=3,表达式是一个整型常量表达式。该死,你说得对。严格地说,这使得我的回答是错误的。不过,我很确定,根据编译器优化设置,这可能是内联的,使其不是常量表达式,但至少是二进制中的常量值。:)试试看:
inti=3;枚举{aaa=128+7-i}检验。编译器将告诉您,
128+7-i
不是整数常量表达式。瞧,包含变量的表达式不是常量表达式(有意义,不是吗?)。FWIW,如果您声明
const int i=3,表达式是一个整型常量表达式。该死,你说得对。严格地说,这使得我的回答是错误的。不过,我很确定,根据编译器优化设置,这可能是内联的,使其不是常量表达式,但至少是二进制中的常量值。:)