In a previous video, we introduced the conditional branch instruction, the if. We also saw that in order to work, this instruction needs to express conditions. The conditions we used until now were simple conditions, which consisted of, for example, comparing the value of a variable with a value. We are now going to see that in C++, it is possible to express more complex conditions. Here you see an example of a condition branch instructions, an if, as we have already seen previously. We can see that in order to write down this instruction, we need to formulate a condition, as we can concretely see here. The condition in the present case is a simple condition, which consist in comparing the value of a variable n to the value 5. Small syntactic detail : the condition in a conditional branch instruction is always surrounded by parentheses, as we can concretely see here. A condition in C++ is in fact a sort of expression whose particularity is to return two possible values. These values are either "true", or "false". Simply enough, a condition will be evaluated to "true" when it is true, and evaluated to "false" when it is false. Let's take a concrete example. Let's imagine I have a variable n whose value is zero, and I write the condition n smaller than five, that I want to evaluate. Here the value of n, zero, is less than 5, which means that this condition is true when I evaluate it it will therefore return the value "true". Now let's imagine n has a value of 10. I evaluate the same expression. Obviously this isn't verified anymore, the condition is false, therefore the evaluation of the condition will return the value "false". Let's begin by examining in a more exhaustive way how to formulate simple conditions in C++. The purpose of a simple condition is to compare two expressions. and to do so we need to use comparison operators. "Less than", "greater than" are two examples which you already had the opportunity to see before. So obviously C++ offers a whole range of predefined operators to formulate simple conditions. Let's imagine for example that I have two variables x, y. I want to know if the value of x is less than the value of y. Naturally, I'm going to use the "less than" operator and write my condition like so. Similarly, if I want to know if the value of x is equal to the value of y, I am going to use the comparison operator ==, which lets me test this condition. You have the operators "less than or equal", "greater or equal", and "different than", which let you express all sorts of simple conditions. Here's a little warning : in C++, the operator used to check if two values are equal is defined by two "equal" symbols. Don't confuse it with the = symbol, which is used to formulate an assignment. If I want to check if the value of a variable n is 5, I'm going to use the operator == to formulate my condition, and not the simple equal operator. You must be aware however that this way of writing a condition is considered licit by C++ compilers, we are going to examine why in the next slide. Licit indeed, yet discouraged, at this stage of learning at least. What you must know is that in C++, every expression whatsoever does something, but also has a value. Let's examine this wtih a concrete example. Here we have an expression, n = 5, this expression clearly does something. What it does is assigning to a variable n the value 5. In C++, this expression also has a value. It's value is the the value of n after the assignment. Thus, the expression "n = 5" has value 5. That is why it is perfectly licit to write something like this : m = n = 5, 5, which aims to assign to a variable m the value of this expression, that is 5. It is therefore totally correct to write something like this : "if (n = 5)" which is the same as writing "if (5)". Knowing that in C++, every non-zero value is equivalent to "true", this condition will always be evaluated as true. Note that in terms of best practices, it is totally discouraged to do it this way. I have shown you this in detail and explicitly only because to confuse == and = to perform a comparison is a mistake beginners often make. So in absolute, this way of doing it is to avoid, even if it is tolerated by the compiler. Now let's illustrate the use of simple conditions in C++ on small examples. Here we have a small program that begins by declaring two variables a and b and affects initial values to them, respectively 1 and 2. We then encounter a conditional branch instruction, which tests if the value of a is the same as the value of b with a simple condition. This is done with the comparison operator ==. Since this condition isn't verified, the result of the condition's evaluation will be the value "false", which will result in branching the execution on the else block of the if instruction, therefore causing to print the message "cas 2", which we can see here. We then continue the execution of the sequences, and we encounter a second conditional branch instruction, which will this time compare the value of two times a to the value of b. By the way, we can here observe that the comparison operators not only allow to compare the values of two variables, as it is the case here, but also the values of two expressions, in a more general sense. Here if we evaluate two times a, we obtain the value 2, which is the same as the value of b, and the result of the condition's evaluation will therefore be "true", which will have as a consequence to branch the execution on the positive block, the true block of the if instruction. This will cause the message "b est égal au double de a" to be printed, as can be seen here. In terms of good practices, we here have a relatively simple expression. You will however note that it is recommended, when the expression becomes more complex, to use parentheses, as we could already do here, by adding parentheses around, for example, this part of the expression, which makes the expression more readable. We have just seen how to use simple conditions by using comparison operators. In practice, it is often necessary to combine many of these simple conditions to formulate a more complex condition. To combine simple expressions, we need to use another type of operator, the logical operators. For example, the logical operator AND, which is defined in C++ either by the key-word "and", or by the symbol "&&", is an operator operating with two operands, which are two logical expressions, that is to say expressions returning either "true" or "false". The result of the evaluation involving the and is "true" only in the case where each operand has the value "true". In every other case, let's say for example that one of the two operands, and a fortiori the two, are "false", the result of the global expression's evaluation will also be "false", here. Now let's have a look, with a concrete example, at how to use the logical operator "and". Here an example of a small program, which asks the user to enter a number, and we want this number to be between 1 and 10. The number is read from the standard input, and stored in a variable n. We want to verify that the number entered by the user meets our expectations, is between the boundary numbers in question, and that's why the two following conditions must simultaneously verified. The entered number must be greater than or equal to 1, and less than or equal to 10. Since we want the two conditions to be simultaneously verified, we must use the logical operator AND. Now let's imagine that the user has entered the value zero, this will mean that this expression's evaluation will return "false". An expression that involves an and returns "true" only if its two operands are "true", which isn't the case here. So here, the result of the evaluation of the expression with the and is also "false". As a result, we will branch on the else part of the if, and print "incorrect" to show the user that he hasn't entered a number according to our expectations. Contrariwise, if the user now enters the value 5, this expression's evaluation will return "true", the evaluation of this second expression will also return "true", which will mean that the evaluation of the expression with the and also returns "true". At this moment, we will branch on the positive part of the if and print "correct" to tell the user that the entered number is indeed correct. Another usual logical operator, the OR, which is defined in C++ either by the reserved word or, or by a double vertical bar. As with the logical operator AND, the logical operator OR requires two operands, which are the logical expressions, meaning that they return "true" or "false". The expression's evaluation with an OR returns "true" if one or the other, not necessarily the two, one or the other of the operands is "true". It is therefore quite clear that the only situation or logical expression involving and OR returning "false" is a situation where the two operands return "false". In this case, the expression with the OR also returns "false". Now let's illustrate the use of the logical OR with a small concrete example. Here we have a small program which asks the user to choose two values. These two values are entered from the standard input and are stored in two variables m and n. In the present case, we want one or the other of them to be positive, as we only need one of the two values to be positive. We test these conditions by using the logical operator OR. Initially, let's suppose that the user enters the values 1 and -1. In this case, the first operand will be evaluated as "true", because it is indeed positive, and therefore the expression's evaluation returns "true", as it is sufficient that one or the other of the operands be "true" for the result to be "true" for the global expression. Therefore, it is indeed the message "au moins une valeur est positive" that will be printed in the present case. Now let's suppose that the entered values are -1 and 1. In this case, the evaluation of this first expression will return "false", and the evaluation of the second expression, on the other hand, will return "true", as it sufficient that one or the other of the operands be "true" for all of it to be "true". The global expression's evaluation returns "true", and once again the message "au moins une valeur est positive" is printed. Last case : let's imagine that the user enters the values minus 1 and -1 for each variable m and n. In this case, the evaluation of the first expression will return "false", the evaluation of the second expression will also return "false", as the two operands are evaluated as "false", the global expression also returns "false" and in this case, it's the message "les deux valeurs sont négatives" that will be printed. Last usual logical operator, the NOT, the negation, which is defined in C++ either by the reserved word not, or by the exclamation mark. The logical operator NOT is a unary logical operator, which means that it expects only one operand, which is once again a logical expression returning "true" or "false". The purpose of the logical operator NOT is to return the negation of the value of its operand. For example, let's suppose that the operand is evaluated as "false", which means that a is greater than or equal to b, the global expression's evaluation with the not will return the negation of "false", namely "true". Now let's suppose that the evaluation of this operand returns "true", the global expression will this time return the negation of "true", namely "false". We'll have the opportunity to see many examples of the use of the operator NOT in the following chapters of this course.