2013-08-11 3 views
0

사실 저는 C로 킥복싱입니다. 방금 ​​자바를 배우기 시작했습니다. 그리고 직접 OCJP6 인증을 준비하십시오. Kathy-Sierra 서적뿐만 아니라 시험 요강에서도 마찬가지로 운영자의 우선 순위 문제는 없습니다. 그러나 orablce-sun Documentation의 Java Operators 우선 순위 테이블을 보았을 때 완전히 혼란스러워졌습니다.C 언어 관점에서 Java Operators 우선 순위가 작동합니까?

From my C-Language: Operators(44) precedence table 
1)() [] .(dot) 
2)Unary: ++pre/--pre, -, +, (cast) 
3)Arithmetic: 
4)bitshift 
5)relational: 
6)bitwise: 
7)logical: 
8)ternary Operator ?: 
9)Assignment operators = += -== etc 
10) unary post++/post-- 

//In C if i say.. 
int main() 
{ 
int i = 1, j; 

j = i++; 

/* 
     The above expression is solved based on the operators precedence! 

     2 operators i have used! 

     one is unary post, another is assignment. 

     here, assignment is higher precedence then unary post. 

     So, first i value is assigned to j. 

     then, i value is incremented because of post increment operator! 
*/ 

printf("i = %d, j = %d", i, j);// i = 2, j = 1 

return 0; 
} 

Java Operators precedence table 
1)postfix expr++ expr-- 
2)unary ++expr --expr +expr -expr ~ ! 
3) arithmetic 
4)shift << >> >>> 
5)relational < > <= >= instanceof 
    equality == != 
6)bitwise AND & 
    bitwise exclusive OR^
    bitwise inclusive OR | 
7)logical AND && 
    logical OR || 
8)ternary ? : 
9)assignment = += -= *= /= %= &= ^= |= <<= >>= >>>= 


//What my biggest doubt is...! 
class Test 
{ 
    public static void main(String[] args) 
    { 
     int i = 1, j; 

     j = i++; 

     /* 
      according to the operators precedence table! 
      unary post operator is 1st precedence than assignment operator! 


      This way first i value should be increment! 
      then after assignment should happen! 

      How come here also i am getting the same values as in C language? 
     */ 

     //System.out.printf("i = %d, j= %d", i, j); //i = 2, j = 1 
     System.out.println("i = "+i+", j = "+j); // i = 2, j = 1 
    } 
    } 

제발 좀 명확히 해주세요!

답변

3

우선 순위가 무엇을 의미하는지 혼란 스럽습니다. 모든 경우에 실행 명령을 의미하지는 않습니다. 중첩 또는 연관의 순서를 의미합니다. 그것은

j = i++ 

j = (i++) 

하지

(j = i)++ 

a = b + c * d 

와 동일

것을 의미
(a = (b + (c * d))) 

야곱 노트 : ++은 원래 값을 사용하거나 저장 한 후에이 값을 증가시키는 것을 의미합니다. 자바에서는 항상 끝나지 만, C와 C++에서는 이것이 언제 일어날 지에 대해서는 정의되어 있지 않다.


편집 :보다 복잡한 예

int i = 3; 
int j = 4; 
int k = i-- * j++; // same as int k = i * j; i--; j++; 
System.out.println(k); 

인쇄

12 

을 다음과 같다 그리고

를 인쇄

int i = 3; 
int j = 4; 
int k = (i = i - 1) * (j = j + 1); 
System.out.println(k); 

과 동일하지

10 
+2

이 답변은 맞습니다. 언급해야 할 중요한 것은 후위 연산자로 '++'가 돌연변이를하기 전에 원래 값을 반환한다는 것입니다. 이것은 OP에게 언급하는 것이 중요 할 수 있습니다. –

+0

@ Peter Lawrey, 나는이 방법을 이해했다. 실제로 평가와 우선 순위의 차이는 무엇인가! 이 점에 대해 자세히 설명해 주시겠습니까? 저는 교실에서만 그런 식으로 C 언어를 배웠습니다. 내 모든 결과물은이 관점에 따라 정확합니다. 표현식 int a = 2-7 ​​+ 3 * 4; * 연산자는 + 및 -보다 높은 우선 순위를가집니다. 연산자 우선 순위 표현식을 기반으로 생각했습니다. 나는 지금 다른 것을 말했다! 우선 순위와 평가 순서가 무엇인지 명확하게 설명해 주시겠습니까? – Omkar

+0

predendence는 순서 연산자가 파싱되어 적용 할 순서를 결정합니다. 이것은 부작용이있는 지점까지의 가장 단순한 경우의 평가 순서와 동일합니다. Java의 경우 post ++와 -는 결국 개념적으로 평가되며 언제든지 (실제로 C에서 수행 할 수 있습니다.) –