!
The !
operator negates, or reverses the truth value of, the expression that follows it. That is, if expression
is true
, then !expression
is false
—and vice versa. More precisely, if expression
is true
, or nonzero, then !expression
is false
. Incidentally, many people call the exclamation point bang, making !x
“bang-ex” and !!x
“bang-bang-ex.”
Usually you can more clearly express a relationship without using the !
operator:
if (!(x > 5)) // if (x <= 5) is clearer
But the !
operator can be useful with functions that return true
/false
values or values that can be interpreted that way. For example, strcmp(s1,s2)
returns a nonzero (true
) value if the two C-style strings s1
and s2
are different from each other and a zero value if they are the same. This implies that !strcmp(s1,s2)
is true
if the two strings are equal.
Listing 6.7 uses the technique of applying the !
operator to a function return value to screen numeric input for suitability to be assigned to type int
. The user-defined function is_int()
, which we’ll discuss further in a moment, returns true
if its argument is within the range of values that can be assigned to type int
. The program then uses the test while(!is_int(num))
to reject values that don’t fit in the range.
// not.cpp -- using the not operator
#include <iostream>
#include <climits>
bool is_int(double);
int main()
{
using namespace std;
double num;
cout << "Yo, dude! Enter an integer value: ";
cin >> num;
while (!is_int(num)) // continue while num is not int-able
{
cout << "Out of range -- please try again: ";
cin >> num;
}
int val = int (num); // type cast
cout << "You've entered the integer " << val << "
Bye
";
return 0;
}
bool is_int(double x)
{
if (x <= INT_MAX && x >= INT_MIN) // use climits values
return true;
else
return false;
}
Here is a sample run of the program in Listing 6.7 on a system with a 32-bit int
:
Yo, dude! Enter an integer value: 6234128679
Out of range -- please try again: -8000222333
Out of range -- please try again: 99999
You've entered the integer 99999
Bye
If you enter a too-large value to a program reading a type int
, many C++ implementations simply truncate the value to fit, without informing you that data was lost. The program in Listing 6.7 avoids that by first reading the potential int
as a double
. The double
type has more than enough precision to hold a typical int
value, and its range is much greater. Another choice for holding the input value would be the long long
type, assuming that it is wider than int
.
The Boolean function is_int()
uses the two symbolic constants (INT_MAX
and INT_MIN
), defined in the climits
file (discussed in Chapter 3, “Dealing with Data”), to determine whether its argument is within the proper limits. If so, the program returns a value of true
; otherwise, it returns false
.
The main()
program uses a while
loop to reject invalid input until the user gets it right. You could make the program friendlier by displaying the int
limits when the input is out of range. After the input has been validated, the program assigns it to an int
variable.
3.145.87.161