Your code have some issue. I have to modified the line below

case C: Roman.L;break;

to avoid compilation error by adding "t =" statement

case C: t = Roman.L;break;

After that I compiled and ran the code. I get an output 21.

Now, your question is about ordinal(). I cut and paste a definition of the ordinal method

(see below) from java.sun.com/j2se/1.5.0/docs/api

"Returns the ordinal of this enumeration constant (its position in its enum declaration,

where the initial constant is assigned an ordinal of zero)."

I hope I explain this correctly. Here goes...

In your code the ordinal sequence is

I = 0

V = 1

X = 2

L = 3

C = 4

M = 5

To

test out this theory, I inserted a statement "System.out.println(t.ordinal());" after

"Roman t = Roman.X;" statement. The output is 2, because Roman.X ordinal (order sequence)

is 2 (see ordinal sequence above). This verifies that the theory is correct.

Next, I ran a debugger and monitor the while loop. The statement "case L: if(t.ordinal()>2) z+=5;"

iterated through the while loop three times. It does this because of the x<10 condition.

[The 1st pass] t.ordinal() = 4 because t = Roman.C, z = 10, and x = 8

[The 2nd pass] t.ordinal() = 3 because t = Roman.L then break out, Z = 15, and x = 9

[The 3rd pass] t.ordinal() = 3 because t = Roman.L then break out, z = 20, and x = 10

Your while(x<10) condition becomes false because x = 10.

System.out.println(z); // output 21

the statement z++ --> z = z + 1 --> z = 20 + 1

r/

Jay