3

Ruby有條件初始化。顯然,Java不是或不是?我儘量寫更多的文章,把範圍限制得儘可能小。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-loop條件下的賦值? YES碼2
  3. 有條件的init NO
  4. 你能在循環分配不同類型的值? 是的回覆
  5. 在循環內初始化的一些規則?稍後聲明外部訪問值,那麼init呢?

1.代碼

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");}} 
+0

什麼是你想實現什麼? – 2010-04-30 00:50:09

+0

@MAS它應該打印「它應該是:hello = hello」,通過假設錯誤不存在。 – 2010-04-30 00:52:07

回答

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); 
} 

的=的操作符是右關聯設置的第一個參數的第二個參數,並計算爲第一個參數,所以像

a = b = c = 4 

相同

(a = (b = (c = 4))) 

其設定C至4,b到C(現在的4)和A到b(現在也4)

你的O代碼NE行可以(重新格式化爲清楚起見)

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");} 
    } 
} 

編輯 - (儘管這是十分可怕的代碼,如果你檢查它在我的項目我會告訴你要儘快把它改寫)

+0

關鍵:賦值與VS declarition:聲明不可能,所以我需要「虛擬變量」,語法糖,首先聲明。然後,我可以製作任務。公認。 – hhh 2010-04-30 02:02:42

+0

側面說明,我覺得在循環之前初始化更安全。字符串不會但是「文件[]」似乎在for循環嘗試賦值給err帶單位化值。 – hhh 2010-04-30 02:08:20

2

變量聲明不能是表達式的一部分,它們是語句,如Java spec said so

如果在Java中存在條件初始化,那麼如何確定一個變量是否被初始化?如何正確編譯代碼? (您需要了解Java編譯器如何工作才能知道這是不可能的)如何處理錯誤?有許多併發症。在您的代碼中,即使變量已初始化,由於Java的範圍策略策略,它將在for塊之後消失。

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循環的範圍,所以變量在循環之後不再可見(超出範圍)。

0

Java條件初始化:

variable = (condition ? expression1 : expression2); 

例如:

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