Everything Is Logical
Now, it's time for you to learn about a new set of operators: logical operators.
There are three logical operators in the C language:
&& The logical AND operator
|| The logical OR operator
! The logical negation operator
The logical AND operator (&&) evaluates the truth or falseness of pairs of expressions. If both expressions are true, the logical AND operator returns 1. Otherwise, the operator returns 0.
However, the logical OR operator (||) returns 1 if at least one of the expressions is true. The || operator returns 0 if both expressions are false.
Only one operand (or expression) can be taken by the logical negation operator (!). If the operand is true, the ! operator returns 0; otherwise, the operator returns 1.
NOTE
In C, if an expression or operator returns a nonzero value, the expression returns TRUE. If an expression or operator returns 0, the expression returns FALSE. In other words, TRUE can be used to represent any nonzero value returned by an expression or operator; FALSE is equivalent to 0.
The following three sections contain examples that show you how to use the three logical operators.
The Logical AND Operator (&&)
A general format of using the logical AND operator is:
exp1 && exp2
where exp1 and exp2 are two expressions evaluated by the AND operator.
We can have a table that shows the return values of the AND operator under the following conditions when exp1 and exp2 return 1 or 0, respectively. See Table 8.1, which can be called the truth table of the AND operator.
Table 8.1. The values returned by the AND operator.
exp1 exp2 Value Returned by &&
1 1 1
1 0 0
0 1 0
0 0 0
Listing 8.2 is an example of using the logical AND operator (&&).
TYPE
Listing 8.2. Using the logical AND operator (&&).
1: /* 08L02.c: Using the logical AND operator */
2: #include <stdio.h>
3:
4: main()
5: {
6: int num;
7:
8: num = 0;
9: printf("The AND operator returns: %d\n",
10: (num%2 == 0) && (num%3 == 0));
11: num = 2;
12: printf("The AND operator returns: %d\n",
13: (num%2 == 0) && (num%3 == 0));
14: num = 3;
15: printf("The AND operator returns: %d\n",
16: (num%2 == 0) && (num%3 == 0));
17: num = 6;
18: printf("The AND operator returns: %d\n",
19: (num%2 == 0) && (num%3 == 0));
20:
21: return 0;
22: }
OUTPUT
After this program is compiled and linked, an executable file, 08L02.exe, is created. The following is the output printed on the screen after the executable is run from a DOS prompt on my machine:
C:\app> 08L02
The AND operator returns: 1
The AND operator returns: 0
The AND operator returns: 0
The AND operator returns: 1
C:\app>
ANALYSIS
In Listing 8.2, an integer variable, num, is declared in line 6 and initialized for the first time in line 8. Lines 9 and 10 print out the value returned by the logical AND operator in the following expression:
(num%2 == 0) && (num%3 == 0)
Here you see two relational expressions, num%2 == 0 and num%3 == 0. In Hour 3, "The Essentials of C Programs," you learned that the arithmetic operator % can be used to obtain the remainder after its first operand is divided by the second operand. Therefore, num%2 yields the remainder of num divided by 2. The relational expression num%2 == 0 returns 1 (TRUE) if the remainder is equal to 0—that is, the value of num can be divided evenly by 2. Likewise, if the value of num can be divided by 3, the relational expression num%3 == 0 returns 1 as
well. Then, according to the truth table of the && operator (see Table 8.1), we know that the combination of the logical AND operator (&&) and the two relational expressions yields 1 if the two relational expressions both return 1; otherwise, it yields 0.
In our case, when num is initialized to 0 in line 8, both 0%2 and 0%3 yield remainders of 0 so that the two relational expressions return TRUE. Therefore, the logical AND operator returns 1.
However, when num is assigned with the value of 2 or 3 as shown in lines 11 and 14, the logical AND operator in line 13 or line 16 returns 0. The reason is that 2 or 3 cannot be divided by both 2 and 3.
Line 17 then assigns num the value of 6. Because 6 is a multiple of both 2 and 3, the logical
AND operator in line 19 returns 1, which is printed out by the printf() function in lines 18 and 19.
From the program in Listing 8.2, you see several single statements spanning into multiple lines. The output from the program in Listing 8.2 shows the values returned by the AND operator when num is assigned with different values.
The Logical OR Operator (||)
As mentioned earlier, the logical OR operator returns 1 if at least one of the expressions is true. The || operator returns 0 if both expressions are false.
A general format of using the logical OR operator is:
exp1 || exp2
where exp1 and exp2 are two expressions evaluated by the OR operator.
Table 8.2 shows the truth table of the OR operator.
exp1 exp2 Value Returned by ||
1 1 1
1 0 1
0 1 1
0 0 0
The program in Listing 8.3 shows how to use the logical OR operator (||).
TYPE
Listing 8.3. Using the logical OR operator (||).
1: /* 08L03.c: Using the logical OR operator */
2: #include <stdio.h>
3:
4: main()
5: {
6: int num;
7:
8: printf("Enter a single digit that can be divided\nby both 2 and 3:\n");
9: for (num = 1; (num%2 != 0) || (num%3 != 0); )
10: num = getchar() - 48;
11: printf("You got such a number: %d\n", num);
12: return 0;
13: }
OUTPUT
The following is the output printed on the screen after the executable, 08L03.exe, is run from a DOS prompt on my machine. The numbers in bold font are what I entered. (The Enter key is pressed after each number is entered.) In the range of 0_9, 0 and 6 are the only two numbers that can be divided evenly by both 2 and 3:
C:\app> 08L03
Enter a single digit that can be divided
by both 2 and 3:
2
3
4
5
6
You got such a number: 6
C:\app>
ANALYSIS
In Listing 8.3, an integer variable, num, is declared in line 6. Line 8 of Listing 8.3 prints out a headline asking the user to enter a single digit. Note that there is a newline character (\n) in the middle of the headline message in the printf() function to break the message into two lines.
In line 9, the integer variable num is initialized in the first expression field of the for statement. The reason to initialize num with 1 is that 1 is such a number that cannot be divided by either 2 nor 3. Thus, the for loop is guaranteed to be executed at least once.
The key part of the program in Listing 8.3 is the logical expression in the for statement:
(num%2 != 0) || (num%3 != 0)
Here the relational expressions num%2 != 0 and num%3 != 0 are evaluated. According to the truth table of the || operator (see Table 8.2), we know that if one of the relational expression returns TRUE, i.e., the value of num cannot be divided completely by either 2 or 3. Then the logical expression returns 1, which allows the for loop to continue.
The for loop stops only if the user enters a digit that can be divided by both 2 and 3. In other words, when both the relational expressions return FALSE, the logical OR operator yields 0, which causes the termination of the for loop.
You can rewrite the program in Listing 8.3 with the if statement, too.
The Logical Negation Operator (!)
A general format of using the logical OR operator is:
!expression
where expression is an expression operated by the negation operator.
The truth table of the negation operator is shown in Table 8.3.
Table 8.3. The values returned by the ! operator.
expression Value Returned by !
1 0
0 1
TYPE
Now, let's take a look at the example, shown in Listing 8.4, that demonstrates how to use the logical negation operator (!).
Listing 8.4. Using the logical negation operator (!).
1: /* 08L04.c: Using the logical negation operator */
2: #include <stdio.h>
3:
4: main()
5: {
6: int num;
7:
8: num = 7;
9: printf("Given num = 7\n");
10: printf("!(num < 7) returns: %d\n", !(num < 7));
11: printf("!(num > 7) returns: %d\n", !(num > 7));
12: printf("!(num == 7) returns: %d\n", !(num == 7));
13: return 0;
14: }
OUTPUT
The following result is obtained by running the executable file 08L04.exe:
C:\app> 08L04
Given num = 7
!(num < 7) returns: 1
!(num > 7) returns: 1
!(num == 7) returns: 0
C:\app>
ANALYSIS
In line 8, note that an integer variable, num, is initialized with 7, which is then displayed by the printf() function in line 9.
In line 10, the relational expression num < 7 returns FALSE (that is, 0), because the value of num is not less than 7. However, by using the logical negation operator, !(num < 7) yields 1. (Refer to the truth table of the ! operator shown in Table 8.3.)
Similarly, the logical expression !(num > 7) returns 1 in line 11.
Because num has the value of 7, the relational expression num == 7 is true; however, the
logical expression !(num == 7) in line 12 returns 0 due to the logical negation operator (!).
- 8 views