Java:条件初始化?

时间:2010-04-30 00:46:10

标签: java initialization conditional declaration variable-assignment

Ruby有条件初始化。显然,Java没有或没有?我尝试更多地写作,以尽可能小地限制范围。

import java.io.*;
import java.util.*;

public class InitFor{

        public static void main(String[] args){
                for(int i=7,k=999;i+((String h="hello").size())<10;i++){}

                System.out.println("It should be: hello = "+h);

        }
}

错误

Press ENTER or type command to continue
InitFor.java:8: ')' expected
  for(int i=7,k=999;i+((String h="hello").size())<10;i++){}
                              ^

拼图

  1. 是否可以在while循环中为声明的值赋值? code1
  2. for循环条件的赋值? code2
  3. 条件初始
  4. 您可以在循环中指定不同类型的值吗?回复中
  5. 内部循环初始化的一些规则?稍后在外部声明访问值,init怎么样?的(?)
  6. 1。 CODE

    import java.io.*;
    import java.util.*;
    
    public class InitFor{
            public static void main(String[] args){
                    int k=5;
                    while((k=(k%3)+1)!=1){
                            System.out.println(k);
                    }
                    //PRINTs only 3
            }
    }
    

    2。 CODE

    import java.io.*;
    import java.util.*;
    
    public class InitFor{
    
            public static void main(String[] args){
                    int k=5;
                    for(;(k=(k%3)+1)!=1;){
                            System.out.println(k);
                    }
                    //PRINTs only 3
                    System.out.println(k); 
                    // WHY DOES IT PRINT 1? Assign in for-loop!
            }
    }
    

    原始问题的一部分,包含许多不同类型的分配和初始化 - 一行代码中的100行代码

    for(int t=0,size=(File[] fs=((File f=f.getParentFile()).listFiles(filt))).size();fs==null;t++){if(t>maxDepth){throw new Exception("No dir to read");}}
    

4 个答案:

答案 0 :(得分:5)

问题是变量可能不会在那里声明;变量可以在块中声明,但不能声明为表达式的一部分。但是,您可以在表达式中分配对象:

for(int i=7,k=999;i+((new String("hello")).length())<10;i++){}

对于您的计划,以下内容会更有意义:

public static void main(String[] args){
    String h = "hello";
    for(int i=7,k=999;(i+h.length())<10;i++){} // not sure what this is doing
    System.out.println("It should be: hello = "+h);
}

我还要补充一点,即使在你拥有它的情况下允许声明,变量也属于for循环的范围,因此变量在循环之后不再可见(超出范围)

答案 1 :(得分:2)

变量声明不能是表达式的一部分,它们是语句,如Java spec said so

如果Java中存在条件初始化,那么如何确定变量是否已初始化?如何正确编译代码? (您需要了解Java编译器如何工作以了解它是不可能的)如何处理错误?有很多并发症。在您的代码中,即使变量已初始化,由于Java的范围策略,它也会在for块之后消失。

答案 2 :(得分:1)

我认为你的作业令人困惑。你可以做到

public static void main(String[] args){
    String h = null;
    for(int i=7,k=999;i+((h="hello").size())<10;i++){}

    System.out.println("It should be: hello = "+h);
}

='s运算符是右关联的,并将第一个参数设置为第二个参数并计算第一个参数,所以类似

a = b = c = 4

相同
(a = (b = (c = 4)))

将c设置为4,b设置为c(现在为4),a设置为b(现为也为4)

您的一行代码可以(为了清晰起见,重新格式化)

File[] fs=null;                                                                            
File f= ??? ; //you never initialize f in the for loop, you need a starting value  
int t, size;                                                                               

for (t=0,size=(fs=((f=f.getParentFile()).listFiles(filt))).size();      
     fs==null;                                                                             
     t++) {
       if(t>maxDepth) {throw new Exception("No dir to read");}
     }
}
编辑 - (虽然那是非常丑陋的代码,如果你在我的项目中检查过它,我会告诉你尽快重写它)

答案 3 :(得分:0)

Java条件初始化:

variable = (condition ? expression1 : expression2);

例如:

int max = (faces.length>curves.length ? faces.length : curves.length);