3

Ruby에는 조건부 초기화가 있습니다. 분명히 Java는 그렇지 않습니까? 가능한 한 작게 범위를 제한하기 위해 더 succintly 쓰려고합니다.자바 : 조건 초기화?

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. 는 동안 루프에 선언 된 값에 값을 할당 할 수 있습니까? 코드 1
  2. for-loop 조건부에서의 지정? YES NO
  3. 초기화 CODE2
  4. 조건은 루프에서 서로 다른 유형의 값을 할당 할 수 있습니까? 대답에 예
  5. 루프 내부 초기화에 대한 규칙은 무엇입니까? 나중에 값에 액세스하도록 외부에 선언하십시오. init은 무엇입니까?

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

당신이 성취하려는거야? –

+0

@MAS 오류가 존재하지 않는다고 가정하고 "It should be : hello = hello"를 출력해야합니다. –

답변

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

=의 연산자, 연관 우측 2 번째의 인수에 첫 번째 인수를 설정하고 첫 번째 인수로 평가 그래서 뭔가

a = b = c = 4 

같습니다

과 동일 할 수 (현재는 4) B에서 C, C (4)에 설정
(a = (b = (c = 4))) 

및 B에 (현재도 4)

하여 오 (즉, 정말 추한 코드는 비록 당신이 내 프로젝트를 체크인하면 내가 빨리 그것을 다시 작성하라는 할 것)

+0

KEY : 대입 VS 선언 : 선언 할 수 없으므로 구문 형 설탕을 먼저 선언해야합니다. 그런 다음, assignmetn을 만들 수 있습니다. 수락 됨. – hhh

+0

사이드 노트, 전에 루프를 초기화하는 것이 더 안전하다고 느낍니다. String하지만 "File []"은 할당을 시도하는 for 루프에서 단위 화 된 값을 가진 err을 제공하는 것 같습니다. – hhh

2

변수 선언은 표현식의 일부가 될 수 없으며 문은 Java spec said so입니다.

Java에서 조건부 초기화가있는 경우 변수가 초기화되었는지 확인하는 방법은 무엇입니까? 코드를 올바르게 컴파일하는 방법? (Java 컴파일러가 불가능하다는 것을 알기 위해 어떻게 작업해야하는지 이해해야합니다.) 오류는 어떻게 처리됩니까? 많은 합병증이 있습니다. 코드에서 변수가 초기화 되더라도 Java 범위 지정 전략으로 인해 for 블록 이후에 사라집니다.

5

문제는 변수를 선언 할 수 없다는 것입니다. 변수는 블록 내에서 선언 될 수 있지만 표현식의 일부로 선언되지 않을 수 있습니다. 그러나 표현의 개체를 할당 할 수 있습니다 :

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(int i=7,k=999;i+((new String("hello")).length())<10;i++){} 

, 더 나을 다음 , 변수는 for-loop의 범위에 속하므로 변수가 루프 이후에 더 이상 보이지 않게됩니다 (범위 밖).

0

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

EDIT (명확성을 위해 포맷) 할 수 자바 조건 초기화 : 예를 들어

variable = (condition ? expression1 : expression2); 

:

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