2013-08-11 2 views
0

На самом деле я китбхат в C. Я только начал изучать Java. И непосредственно готовятся к сертификации OCJP6. В книге Кэти-Сьерра, а также в экзаменационной программе также нет приоритета Оператора. Но я был в полном смятении, когда увидел таблицу приоритетов Java-операторов от orablce-sun Documentation.Работает ли приоритет Java-операторов при сравнении с перспективой на языке C?

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))) 

Как примечания Джейкоба: ++ означает увеличение этого значения после использования или сохранения исходного значения. В Java это всегда делается в конце, тогда как в C и C++ не определяется, когда это произойдет.


EDIT: более сложный пример выглядит следующим образом

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

Этот ответ верен, одно замечание, которое вам не хватает, важно отметить, что '++' как оператор postfix вернет исходное значение перед его мутированием. Это может быть важно упомянуть OP. –

+0

@Peter Lawrey, я так понял, что на самом деле разница между порядком оценки и приоритетом! Не могли бы вы подробно рассказать об этом? Я изучил язык C таким образом только в классе. и мои все выходы правильны в соответствии с этой перспективой. Предположите выражение int a = 2 - 7 + 3 * 4; * оператор имеет более высокий приоритет, чем + и -. Я думал, что на основе выражения приоритета операторов оценивается! я сказал, теперь другое дело! можете ли вы прояснить мне, что является приоритетом и каков порядок оценки. – Omkar

+0

Предварительная проверка - оператор порядка анализируется для определения того, что применяется в каком порядке. Это то же самое, что и порядок оценки в простейшем случае, вплоть до точки, где есть побочные эффекты. В случае Java post ++ и - оцениваются в конце, так как, по идее, они могут возникать в любое время (и, действительно, в C) –

Смежные вопросы