2014-10-28 2 views
0

이 쉬운 질문에 대해 유감스럽게 생각하지만 답변을 찾지 못했습니다. while 루프는 이렇게 생겼습니다. 비교 전후에 계산합니까?while 루프 ++ 변수

a = 0; 
while(a++ < 5) 
{ 
    .... 

처음은 "1 < 5"또는 "0 < 5"로 볼 것이다 루프를 실행합니다. 감사합니다

+2

'0 <5' ......... – BLUEPIXY

+1

다음은 많은 동작 적으로 허용 가능한 순서 중 하나이다 왜 그것을 시험해 보지 그래? 'printf ('% d', a);'를 반복하고 무슨 일이 일어나는 지보십시오. –

+0

@MarcB : 인쇄 결과가 결정적이지 않고 직관적이지 않기 때문에? – njzk2

답변

2

비교 전에 증가를 을 수행하지만, 루프의 몸은 icrementation 후에 값 을 본다. 따라서 첫 번째 실행에서는 0 <을 5와 비교하지만 루프 a의 값은 1입니다.

+0

++ a? 비교 이전에 증가가 있었습니까? – Fjodor

+0

@Fjodor : 예 - 그러면 비교 전에 실행되므로 1 <5가됩니다. –

1

후위 연산자는 "이후"에 적용됩니다. 접두사 연산자는 "before"에 적용됩니다. 처음으로 'a'값을 비교 한 값을 제공 한 경우 값은 0과 같습니다.

주의해서 사용하지 않으면 이러한 연산자에 문제가 발생할 수 있으므로주의하십시오. [ix ++] = a [ix] + 1; 어쩌면 그것은 당신이 원하는 것을 할 것입니다, 어쩌면 ... 시도해보십시오

그냥 다른 의견을 읽으십시오 ... ++ 값을 취할 것입니다. insde 루프.

+1

"작동 여부"에 관계없이 'a [ix ++] = a [ix] + 1'은 * 정의되지 않은 행동 *, 악마가 코에서 날아갈 수도 있습니다. –

+0

코 악마에 대한 느낌에 따라 원하는 것은 아닐 수도 있습니다 .-D – Dweeberly

1

표현식 a++의 결과는 a의 현재 값이므로 루프는 while (0 < 5)으로 시작합니다.

표현식 ++a의 결과는 a + 1이므로, while (++a < 5)이라고 쓰면 while (1 < 5)으로 시작합니다.

두 경우 모두 a부작용으로 1 씩 증가합니다. 표현식을 평가 한 직후에 부작용을 적용 할 필요는 없습니다. 유일한 보장은 다음 시퀀스 포인트 전에 적용된다는 것입니다 (이 특별한 경우에는 시퀀스 포인트가 조건식의 끝에 있기 때문에 루프 본문에 업데이트 된 값 a이 표시됨). 그래서 당신은

x = a++ * ++b; 

같은 표현이있는 경우, 그것은 x = a * (b + 1)으로 평가 수 있지만 a 평가 된 ++b 전에 증가 할 것이라는 보장은 없다, 나 하나가되기 전에 증가합니다 어떤 보장이 곱셈과 배정.

  1. t1 <- b + 1
  2. x <- a * t1
  3. b <- b + 1
  4. a <- a + 1