2013-02-23 3 views
3

나는 다음과 같은 코드를 가지고 :switch 문 및 점진

int i = 1; 
int j = 0; 
switch (i++) 
{ 
case 1: j += i; 
case 2: j += i; 
case 3: j += i; 
break; 
} 
printf("%d %d",i, j); 

가 후행 증가 연산자입니다 때문에 i++ 표현 1-i 평가, 그래서 경우 하나의 문이 평가 j을 의미 실행됩니다 2. 다음 휴식없이, 프로그램은 다음의 모든 문장을 계속 실행합니다. i 값이 변경되지 않으므로 j 값도 변경되지 않습니다. 그래서 출력은 2 2과 같을 것이지만 2 6으로 밝혀졌습니다. 누구든지 제게 설명을 해주실 수 있습니까, 고마워요!

답변

5

i의 값이 변경되지 않으므로 j 값도 변경되지 않습니다.

사실이 아닙니다.

j += ij = j + i과 동일하고,switch(..) 문 내부 i is 2.

이 실행됩니다 3 번6입니다.

+0

실례합니다. j + = i는 j = i + 1과 같습니다. 따라서 i (1)의 원래 값은 사례 1을 트리거하는 데 사용됩니다. 그런 다음 사례 1이 처리되기 전에 증가 된 값 (2)으로 설정됩니다. 맞습니까? – drawar

+0

@drawar 맞습니다. –

+0

정말 도움이됩니다. 정말 고마워요! – drawar

2

중요한 점은 case 문을 처리하기 전에 "switch (i ++)"가 평가된다는 것입니다. 따라서 i ++는 i를 2로 설정합니다. 그러나 i ++가 게시물 증가 이후 1로 평가됩니다. 따라서 첫 번째 경우가 실행됩니다. break 문이 없으므로 코드는 세 가지 모두를 거쳐 j == 6이됩니다.

1

j는 스위치 블록에서 3 번 증가합니다. 나는 포스트가 증가하기 때문에 처음으로 케이스 1로 갈 것입니다. 휴식 문장이 없으므로 모든 사례 문장을 거쳐 값을 부여합니다. 6

1

가을을 방지하기 위해 break 문을 각 사례 문장에 추가해야합니다 통해 행동.
1. 스위치 내가 = 1
2. 증가 i가 2
3. 경우 1.
4. 종료 스위치를 스위치를 입력하고 실행 평가 : 당신이 코드가 작동 생각하는 방법은 같이 간다.
방법은 실제로 발생합니다
1. 전환 전 = 1
2. 증가 i가 2
3. 스위치 문을 입력하고 excute에 경우 1.
4. 가을을 통해 케이스 2를 실행하기 위해 평가합니다.
5. 넘어져서 사례 3을 실행하십시오.
6. 종료 스위치 설명. 당신이 시도하고자하는 행동에 대한

:
스위치는 (i ++)
{
경우 1 : J의 + = 난;
휴식;
이 ... 내가 대신 J + = I = 사례 2와 사례 3
} 당신이 J를했던 경우

0

에 대해 동일한 작업을 수행, 예상 답이 올 것입니다. 그러나 당신은 j + = i를 사용하여 j = j + i로 변환합니다; 즉, j가 모든 단계에서 업데이트되고 있음을 의미합니다.