자바 : for 루프 초기화에서 여러 변수를 초기화 하시겠습니까?


92

유형이 다른 두 개의 루프 변수를 갖고 싶습니다. 이 작업을 수행 할 수있는 방법이 있습니까?

@Override
public T get(int index) throws IndexOutOfBoundsException {
    // syntax error on first 'int'
    for (Node<T> current = first, int currentIndex; current != null; 
            current = current.next, currentIndex++) {
        if (currentIndex == index) {
            return current.datum;
        }
    }
    throw new IndexOutOfBoundsException();
}

무엇입니까 first? 어디에도 선언되지 않았습니다. 반원입니까?
extraneon

7
아래 하나 개의 답변을 받아 들여야한다
Mr_and_Mrs_D

C와 달리 Java에는 쉼표 연산자 ( stackoverflow.com/questions/12601596/…) 가 없습니다.이 연산자를 사용하면 서로 다른 유형의 두 변수를 초기화 (선언하지는 않음) 할 수 있습니다.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

@Nick Heiner 아래 답변 중 하나를 수락 된 것으로 표시해 주시겠습니까?
James Monger

답변:


105

명령문 의 초기화는 for지역 변수 선언 규칙을 따릅니다 .

이것은 합법적입니다 (어리석은 경우) :

for (int a = 0, b[] = { 1 }, c[][] = { { 1 }, { 2 } }; a < 10; a++) {
  // something
}

그러나 원하는대로 구별 Nodeint유형 을 선언 하려는 것은 지역 변수 선언에 적합하지 않습니다.

다음과 같은 블록을 사용하여 메서드 내에서 추가 변수의 범위를 제한 할 수 있습니다.

{
  int n = 0;
  for (Object o = new Object();/* expr */;/* expr */) {
    // do something
  }
}

이렇게하면 메서드의 다른 곳에서 실수로 변수를 재사용하지 않습니다.


10
언어 디자이너가 이처럼 불필요한 제약을 구현 한 이유를 아는 사람이 있습니까?
Jeff Axelrod

@glenviewjeff-별도의 질문으로하는 것이 가장 좋습니다.
McDowell

2
@JeffAxelrod, Java가 C ++를 모델로했기 때문에 역사적인 이유 때문일 수 있습니다 ...이 게시물을 참조하십시오. stackoverflow.com/questions/2687392/…
Christophe Roussy

3
블록 사용에 +1, 나는 그것들을 많이 사용합니다. 여전히 어리석은 실수를하는 것보다 낫습니다
Christophe Roussy 2013

18

당신은 이것을 좋아할 수 없습니다. 동일한 유형의 여러 변수를 사용 for(Object var1 = null, var2 = null; ...)하거나 다른 변수를 추출하여 for 루프 전에 선언하십시오.


9

변수 선언 ( Node<T> current, int currentIndex)을 루프 외부 로 이동 하면 작동합니다. 이 같은

int currentIndex;
Node<T> current;
for (current = first; current != null; current = current.next, currentIndex++) {

또는 어쩌면

int currentIndex;
for (Node<T> current = first; current != null; current = current.next, currentIndex++) {

1
둘 다 컴파일되지 않습니다. 사용하기 전에 변수를 초기화해야합니다.
unbeli

@unbeli 음, 수동 코드 컴파일에서 운동하지 않았습니다. :) 그냥 아이디어를주고 싶었습니다.
Nikita Rybak

3
@unbeli : 명확하게하기 위해 currentIndex를 초기화해야합니다. Nikita가 첫 번째로하는 일은 "currentIndex ++"입니다. 이것은 자연스럽게 질문을 제기합니다. 첫 번째 사용은 첫 번째로 설정하는 것이므로 전류는 괜찮습니다.
Jay

일반적으로 더 나은 쓰기에 for 루프의 점진은, 하나는 VAR의 내용을 복제 할 표기법에는 var ++ VAR ++ 컴파일러에서 요구를 사용해야 하기 전에 아무도 그것을 원하지 않는다하더라도 식의 결과로 반환을 증가. 물론 컴파일러는이를 최적화하지만 다른 사람들이 청소하기를 기다리는 길에 쓰레기를 버리는 것과 같습니다.
Chucky

5

초기화 블록에서 선언 된 변수는 동일한 유형이어야합니다.

설계에 따라 for 루프에서 다른 데이터 유형을 초기화 할 수 없습니다. 저는 단지 작은 예를 들었습니다.

for(int i=0, b=0, c=0, d=0....;/*condition to be applied */;/*increment or other logic*/){
      //Your Code goes here
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.