Can I use the not operator in C++ on int values?

39,747

Solution 1

Yes. For integral types, ! returns true if the operand is zero, and false otherwise.

So !b here just means b == 0.


This is a particular case where a value is converted to a bool. The !b can be viewed as !((bool)b) so the question is what is the "truthness" of b. In C++, arithmetic types, pointer types and enum can be converted to bool. When the value is 0 or null, the result is false, otherwise it is true (C++ §4.1.2).

Of course custom classes can even overload the operator! or operator<types can be convert to bool> to allow the !b for their classes. For instance, std::stream has overloaded the operator! and operator void* for checking the failbit, so that idioms like

while (std::cin >> x) {   // <-- conversion to bool needed here
  ...

can be used.

(But your code !( a > b && b <= c) || a > c && !b is just cryptic.)

Solution 2

Originally, in C (on which C++ is based) there was no Boolean type. Instead, the value "true" was assigned to any non-zero value and the value "false" was assigned to anything which evaluates to zero. This behavior still exists in C++. So for an int x, the expressions !x means "x not true", which is "x not non-zero", i.e. it's true if x is zero.

Solution 3

You can, !b is equivalent to (b == 0).

Solution 4

The test for int is true for non-zero values and false for zero values, so not is just true for zero values and false for non-zero values.

Solution 5

The build-in ! operator converts its argument to bool. The standard specifies that there exists a conversion from any arithmetic type(int, char,.... float, double...) to bool. If the source value is 0 the result is true, otherwise it is false

Share:
39,747
001
Author by

001

Only questions with complete answers are accepted as solutions.

Updated on September 23, 2021

Comments

  • 001
    001 over 2 years

    Strange question, but someone showed me this, I was wondering can you use the not ! operator for int in C++? (its strange to me).

    #include <iostream>
    using namespace std;
    
    int main()
    {
       int a=5, b=4, c=4, d;
       d = !( a > b && b <= c) || a > c && !b;
       cout << d;
       system ("pause");
       return 0;
    }
    
  • Admin
    Admin over 4 years
    Sorry, I know I'm 8 years late, but do you have a quote from a C++ standard to back up your answer?