编译器会优化它吗?

Met*_*est 14 c java optimization

说我在C代码中有这样的东西.我知道你可以使用一个#define代替,让编译器不能编译它,但只是出于好奇,我问的是编译器是否也会想出这个问题.

我认为这对Java Compiler来说更重要,因为它不支持#define.

const int CONDITION = 0;
........
// Will the compiler compile this?
if ( CONDITION )
{

}
.......
Run Code Online (Sandbox Code Playgroud)

JB *_*zet 21

在Java中,if中的代码甚至不会是编译代码的一部分.它必须编译,但不会写入编译的字节码.它实际上取决于编译器,但我不知道没有优化它的编译器.规则在JLS中定义:

优化编译器可以实现语句x = 3; 将永远不会执行,并可能选择从生成的类文件中省略该语句的代码,但语句x = 3; 在此处指定的技术意义上,不被视为"无法到达".

这种不同处理的基本原理是允许程序员定义"标志变量",例如:

static final boolean DEBUG = false;
Run Code Online (Sandbox Code Playgroud)

然后编写如下代码:

if (DEBUG) { x=3; }
Run Code Online (Sandbox Code Playgroud)

我们的想法是,应该可以将DEBUG的值从false更改为true或从true更改为false,然后正确编译代码而不对程序文本进行其他更改.

关于C.不知道


San*_*rma 11

首先,Java不允许像C(条件表达式非布尔值if,while等等).另外,如果你的检查中有一个"常量"表达式if,编译器会警告你正在比较相同的表达式,所以我确定它已经过优化.例如

    final int i = 1;
    if (1 == i) { // warning
        System.out.println("HI");
    }
Run Code Online (Sandbox Code Playgroud)


Voo*_*Voo 6

而不是问这么简单的问题(唯一正确的答案是"用你的编译器试试") - 为什么不尝试呢?

public class Test {
    public static void main(String[] args) {
        if (true) {
            System.out.println("Yep");
        }
        boolean var = false;
        if (var) {
            System.out.println("Nope");
        }
        final boolean var2 = false;
        if (var2) {
            System.out.println("Nope");
        }
    }
}

javac .\Test.java 
javap -c Test
Compiled from "Test.java"
public class Test {
  public Test();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
       3: ldc           #3                  // String Yep
       5: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
       8: iconst_0
       9: istore_1
      10: iload_1
      11: ifeq          22
      14: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
      17: ldc           #3                  // String Yep
      19: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
      22: return
}
Run Code Online (Sandbox Code Playgroud)

您不需要了解java/c#字节码或汇编就能够了解正在发生的事情.现在去尝试同样的C#..