Okay, we're going to go on to more complicated expression evaluation. We're going to look at some more involved cases. One of those things that gets a lot of people trouble at first is to remember that tokens like the slash token have different meanings in different contexts. So besides the fact that a slash token can be used to be part of a comment, a single slash is generally a divide in an expression but that divide could be either the integer divide operator or the floating point divide operator, and that gets determined contextually. Similarly, people have trouble with the remainder or modulo operator, the modulus operator. Somehow they don't use that as much in daily practice, so it's hard for them to remember how that works. Then there are operators that are unique to the C language and they include auto-increment and auto-decrement, and they are plus plus and minus minus. Then there are operators that are based on assignments, so they are ordinary assignment but also an operator like plus assign. So you might see plus equals or minus equals, but when you see equals equals, that itself is a logical operators. So context means a lot, and I shouldn't say these things are unique because while C pioneered much of this stuff, they do get used and typically languages derived from C or with some inspiration for C, so you will see such operators in Java and C++ as well. Now, if stuff gets too confusing in expressions, then to unconfuse yourself and people reading the code and maintaining the code, use parentheses. Keep in mind that parentheses override the built-in precedence and associativity of the operators. So a times b is high precedence than plus. If you had a times b plus c without parentheses, it would mean that first thing. It would mean first do a times b because of its higher precedence then add in c, but if you wanted a times b parenthesize c, then you'd have to use parentheses because that would override the precedence and associativity of those, the built-in ones for those operators. There are also gotchas that you have to keep in mind and a typical one is the use of divide when it's an integer divide, you don't have this problem with multiply but 3 divided 7 is going to be 0, whereas 7 divided by 3 is going to be 2. In those cases, there would be a remainder and the remainder just gets thrown away. But 5 divide 2.0, because 2.0 is a floating point constant is indeed 2.5, which itself is a floating expression. Finally, the modulo operator, as I say you have to familiarize yourself with it if you haven't used the idea of modulus for a while. That's just what a remainder is an integer divides. So three modulo of seven, the remainder would be three, or seven modulo three, the remainder would be one. Here's the use of pre and post increment. These are specialized but very useful because they abbreviate what would take some more writing. So the pre-increment namely plus plus B, what it means is B is assigned b plus 1. So b plus 1, the increment gets done first, then the assignment a is assigned the resulting value of a B after the increment. In the post case which has higher precedence by the way, a assign b plus plus is the equivalent is a first assign b. So if b was five a would be five but then B would become six. All right, so I hope you'll experiment, and I'm going to show you an experiment right now. I am going to switch over to my runtime window. So here's some code I wrote earlier, two experiment, and this is the code that you should try to either copy or write your own code of this kind and just tried to check your understanding of evaluation, make sure what gets done on the machine is what you are expected. So in the first case, we have equals sign meaning initialized. So a is initialized to five and d is initialized to zero, then we have an expression where c is assigned a minus b. While a is five and b is seven, so we'd expect 5 minus 7 to be minus 2. So if we use that print statement, we should see a is equal to 5, b is equal to 7, c is equal to minus 2 and d is equal to 0. Now, in this part of the code, we're seeing how integer divide would happen. So five integer divide seven, that's going to be zero. D will be equal to seven divide five. So that will be one. If this had been all in floating point environment, if everything had been set up as floating point, then instead you'd have the equivalent of five-sevenths and floating point or seven-fifths or 1.4 for d, but that won't happen. You're going to get zero and one. Also, further on here, I won't look at the module, I'll let you work that out, but here's an interesting one. Here, we see the difference between unary minus and binary minus. Unary minus has higher precedence. So that occurs first. So five becomes minus five, and then we have a binary minus where we subtract seven, positive value seven and the result should be minus 12. Here, we're seeing the difference between prefix auto-increment. So a will move from five to six but this is postfix auto-increments. So B remains seven. So 7 plus 6, c will become 13, but then when the whole thing is executed after assignment, then b will become eight. Here, we see the plus assignment operator. So this means whatever d's value was where in the earlier case d would be minus 12, we would add in five so we'd end up with a minus seven. So again, try to understand all this, and then here's actual the actual running of the program results and these values. I will write a quiz for you, and most likely put something of this kind on the class final.