2014-08-02 3 views
3

Как компилятор интерпретирует этот оператор switch? Я предполагаю, что содержимое внутри оператора switch (41), так почему оно переходит к случаю 2?Как оценивается этот оператор switch?

int i = 4; 
    int j = 2; 

    switch(i++-j) {   //switch is evaluted to be (41)?? 
    case 3: i++; break; 
    case 1: j++; break; 
    case 2: j+=2; break; 
    case 5: i+=2; break; 
    default: i +=5; break; 
    } 

    System.out.println(i); //Prints out 4 
    System.out.println(j); //Prints out 5 
+2

Пожалуйста, добавьте тег, чтобы указать, на каком языке это. (Я * думаю * это Java, но я не хочу этого делать.) –

+0

Хорошо, я буду делать, в принципе, я в основном спрашивал о том, как оценивался оператор switch, который должен быть независим от большинства языков. – user3601148

+0

Возможно, это должно быть, но это не так. –

ответ

6

Перерыв вниз:

i++-j 

++ имеет более высокий приоритет, чем - так что:

(i++)-j 

++ является приращение постфикс - это будет оценивать до значения i до приращения. Начальное значение i равно 4, так что это:

4-j 

j является 2 поэтому выражение вычисляется как 4-2 = 2.

i был увеличен, поэтому теперь имеет значение 5; j изменен кодом в инструкции switch.

+0

ahh спасибо! По какой-то причине мой разум обманул меня (как я сразу подумал)! – user3601148

0

В состоянии переключателя значение выражения будет 4 - 2 = 2.

Затем, после того, как используется это значение, я становлюсь 5.

Затем, в случае 2: ​​буду выполнен , J = 2, J = + 2 будет 4.

Таким образом, выходной сигнал будет:

1

через инициализацию

i=4; 
j=2; 

switch(i++-j) { // Expression evaluates as 4-2 = 2. 
    // new value for i=5 since i++ executed 
    case 3: i++; break; // skipped 
    case 1: j++; break; // skipped 
    case 2: j+=2; break; // Executed, hence evaluates as 2+2 = 4. 
    case 5: i+=2; break; // Skipped 
    default: i +=5; break; // Skipped 
    } 

    System.out.println(i); // Prints out 5 
    System.out.println(j); // Prints out 4 
Смежные вопросы