考虑以下C程序:
void bar();
void baz();
void foo( int a ) {
if ( a ) {
bar();
}
else {
baz();
}
}
Run Code Online (Sandbox Code Playgroud)
在我的基于x86-64的计算机上,GCC使用-O1优化级别生成的指令给出:
0: sub $0x8,%rsp
4: test %edi,%edi
6: je 14 <foo+0x14>
8: mov $0x0,%eax
d: callq 12 <foo+0x12> # relocation to bar
12: jmp 1e <foo+0x1e>
14: mov $0x0,%eax
19: callq 1e <foo+0x1e> # relocation to baz
1e: add $0x8,%rsp
22: retq
Run Code Online (Sandbox Code Playgroud)
而添加-freorder-blocks优化参数(包含在-O2中)会将代码转换为:
0: sub $0x8,%rsp
4: test %edi,%edi
6: jne 17 <foo+0x17>
8: mov $0x0,%eax
d: …
Run Code Online (Sandbox Code Playgroud) 虽然JLS规范中似乎非常精确地描述了Java语法,但是有一些具体案例我无法应用于给定的定义.
例如,采用ClassInstanceCreationExpression
JLS8第15.9章中的规则,非限定new
表达式应采用以下形式:
new [TypeArguments] {Annotation} Identifier [TypeArgumentsOrDiamond] ( [ArgumentList] ) [ClassBody]
Run Code Online (Sandbox Code Playgroud)
Identifier
是一个标准的Java标识符(基本上是Java字母/数字,没有点).
该定义如何应用于静态嵌套类instanciation等有效表达式:
new C1.C2();
Run Code Online (Sandbox Code Playgroud)
或包合格的类instanciation:
new java.lang.String("foo");
Run Code Online (Sandbox Code Playgroud)
鉴于点不能成为一部分Identifier
?
请注意,对于非限定new
表达式,此定义从JLS7更改为JLS8,其中JLS7 表示:
new [TypeArguments] TypeDeclSpecifier [TypeArgumentsOrDiamond]( [ArgumentList] ) [ClassBody]
Run Code Online (Sandbox Code Playgroud)
TypeDeclSpecifier
被定义为:
TypeDeclSpecifier:
TypeName
ClassOrInterfaceType . Identifier
Run Code Online (Sandbox Code Playgroud)
允许new
静态嵌套类和包限定类的非限定表达式.