2014-04-30 2 views
2

좀 연습을 통과했지만, 난이 하나의 혼란 스러워요 :사전/사후 증가/감소 및 운영자 주문 혼란

public static int f (int x, int y) { 
    int b=y--; 
    while (b>0) { 
    if (x%2!=0) { 
     --x; 
     y=y-2; 
    } 
    else { 
     x=x/2; 
     b=b-x-1; 
    } 
    } 
    return x+y; 
} 

b=y--의 목적은 무엇인가? 예를 들어, while 루프 (while (b>0))에 처음 들어가면 x=5y=5b = 4 또는 5가 될 것입니까? 컴퓨터에서 코드를 실행할 때 b은 5입니다. 반환 값은 3입니다. 이것은 나에게 정말로 불분명합니다. 미안, 내 질문에 불분명하다.

+3

연산자 우선 순위 및 사전/사후 증가/감소 연산자에 대해 읽어보십시오. –

+0

모든 단계에서 각 변수를 검사 할 수 있으므로 디버거에서 코드를 추적하면 매우 유용합니다. – alk

답변

5

int b=y--; 제 assignes b=y는 다음y (y--)을 감소시킨다.

prefix/postfix unary increment operator도 참조하십시오.

(링크 된 페이지에서 가져온)이 예를 보여줍니다

class PrePostDemo { 
    public static void main(String[] args){ 
     int i = 3; 
     i++; 
     // prints 4 
     System.out.println(i); 
     ++i;    
     // prints 5 
     System.out.println(i); 
     // prints 6 
     System.out.println(++i); 
     // prints 6 
     System.out.println(i++); 
     // prints 7 
     System.out.println(i); 
    } 
} 
+3

은 b가 할당 된 후 y를 1 씩 감소시킵니다. –

+0

@ La-comadreja 감사합니다! 결정된. – Sebastian

1

내가 b는 루프를 입력 5와 동일 할 생각 때문에

b=y--; 

때 "-"변수 뒤에 그것은 행동 후에 그것을 감소시킨다.

1

새로운 프로그래머를 혼동시킬 수 있으므로 코딩이 좋지 않습니다.

함수는 위의 예제처럼 (참조로 전달하는 것과 달리) y 복사본을 가져와 값을 전달한다고 가정하고 값을 감소시키고 b에 할당합니다. 함수가 호출 될 때 전달 된 인수를 변경하지 않습니다.

+2

아니면 새로운 프로그래머가 사전 및 증분 연산자를 실제로 생각하고 이해하도록 혼란스럽게하기위한 연습입니다. 그것의 빈약 한 코딩을 위해 – indivisible

+1

+1. 그것은이고, 그것에 대한 변명이 없습니다 –

+0

아마 @mbs는 사실입니다. 이것에게서 가지고가는 유일한 교훈은이다; 접두어를 절대 사용하지 마십시오. 자신의 –

3

사후 증가/감소와 선행 증가/감소 간의 차이는 evaluation of the expression입니다.

사전 증가 및 선행 감소 연산자는 피연산자를 1 씩 증가 (또는 감소)하고 표현식의 값은 결과 증가분 (또는 감소분) 값입니다. 반대로 사후 증가 및 사후 감소 연산자는 피연산자 값을 1 씩 증가 (또는 감소)하지만 표현식의 값은 증가 (또는 감소) 작업 이전의 피연산자 원래 값입니다. 즉

:

int a = 5; 
int b; 
b = --a; // the value of the expression --a is a-1. b is now 4, as is a. 
b = a--; // the value of the expression a-- is a. b is still 4, but a is 3. 

는 프로그램이 모든을 수행하는 식을 평가해야한다는 것을 기억하십시오. 모든 것은 표현식이며 변수에 대한 간단한 언급 일뿐입니다.다음은 표현의 모든 :

  • a
  • a-1
  • 물론
  • --a && ++a
  • System.out.println(a)

, 표현의 평가, operator precedence는 표현만큼의 값을 지시 초등학교에서 배운 PEMDAS. 증가/감소와 같은 일부 연산자는 부작용이 있으며 이는 물론 재미 있고 기능 프로그래밍이 만들어진 이유 중 하나입니다.