문제
이 코드를 실행할 때 어떤 행동을 기대할 수 있습니까?
do while(testA) {
// do stuff
} while(testB);
그것은 다음과 같이 행동 할 것인가?
do {
while(testA) {
// do stuff
}
} while(testB);
또는:
if(testA) {
do {
// do stuff
} while(testA && testB);
}
아니면 완전히 예상치 못한 일이 있습니까?
나는 이것이 매우 모호하다고 생각하기 때문에이 질문을 하고이 주제를 검색하는 다른 사람들에게는이 질문을합니다. ~ 아니다 나는 그것을 테스트하는 것이 게으르다.
해결책
첫 번째 블록과 동일합니다.
do {
while(testA) {
// do stuff
}
} while(testB);
관련 부분 자바 문법 구문 분석 할 때 다음과 같습니다.
DoStatement:
do Statement while ( Expression ) ;
Statement:
WhileStatement
WhileStatement:
while ( Expression ) Statement
Statement:
Block
Block:
{ BlockStatements_opt }
Java 컴파일러가 이것을 다음과 같이 구문 분석 할 것임을 알 수 있습니다. do <WhileStatement> while ( Expression ) ;
. 이것이 당신이 쓴 코드를 구문 분석하는 유일한 유효한 방법입니다.
이 구성을 구문 분석하는 것은 특별한 규칙이 없음을 명심하십시오. 그것은 단지 do-while 루프가 쓰여지는 비정상적인 방법으로 인해 인간이 읽는 것이 혼란스러워집니다. 정상적인 사용에서는 항상 다음과 같이 작성됩니다 do { ... } while
명백한 곱슬 괄호와 함께.
다른 팁
실제로 작동하지만 행동은 테스트하는 조건에 따라 다릅니다. 예 :이 코드 :
int i = 2;
int j = 4;
do while(j > 0) {
i--; j--;
System.out.println("i:" + i + " j:" + j);
} while(i > 0);
출력 :
i:1 j:3
i:0 j:2
i:-1 j:1
i:-2 j:0
그래서 그것은 다음과 같이 작동합니다.
while(j>0) {
}
변수 이름을 교환함으로써 :
do while(i > 0) {
//.. same as above
} while(j > 0);
출력은 다음과 같습니다.
i:1 j:3
i:0 j:2
첫 번째 경우와 동일하게 작동하는 것처럼 보입니다 (예 : 첫 번째는 고려됩니다). 응용 프로그램이 종료되지 않습니다!
요약:
언제 testA
~이다 만족하지 않습니다 더 이상 testB
또한 만족하지 않습니다, 코드는 정상처럼 작동합니다 while(testA){}
고리.
하지만: 언제에 testA
~이다 더 이상 만족하지 않습니다, testB
여전히 만족합니다, 루프는입니다 ~ 아니다 더 이상 실행되고 대본이 있습니다 종료되지 않습니다. 이것은 "외부"루프의 상태를 루프 내부에서 변경 해야하는 경우에만 적용됩니다.
업데이트:그리고 다른 대답을 읽은 후, 나는 이것이 중첩 된 사람들의 행동이라는 것을 알고 있습니다. do-while
- while
고리.
어쨌든, 교훈 : 혼란 스러울 수 있기 때문에 이런 종류의 구문을 사용하지 마십시오.)
그것은처럼 행동합니다
do {
while(testA) {
// stuff
}
} while(testB);
따라서 해당 코드 블록은 다음과 같은 방식으로 구문 분석됩니다.
testb는 true 인 동안 {코드 블록}을 수행하십시오. 여기서 {코드 블록}은 내부입니다.
그런 코드를 작성하는 것은 확실히 드문 일입니다 :)
대답은 #1입니다. 그것은 오래 지속될 것입니다 testB
만족 스럽지만 코드를 실행하지 않습니다. testA
만족스럽지 않습니다.
"do {} while();
"하나는 하나의 구성입니다."while(){}
"또 다른 것입니다.
""와 같은 것은 없습니다.do while
"; 당신은 우연히 그들을 중첩하고 {}가 단일 지침의 선택 사항이라는 사실을 활용하고 있습니다.
다시 말해, 이것은 법적 구문입니다.
do System.out.println("Hello World") while (true);
그리고처럼 if
-진료소, 블록은 단일 진술로 취급됩니다.
즉, 첫 번째 가능한 대답은 올바른 대답입니다.while(){}
"외부 내부의 단일 비 혈장 인 것"do {} while();
"
나는이 코드가 합법적이라고 생각하지 않습니다.
do while(testA) {
// do stuff
} while(testB);