### 8.1 Logical Operators ¶

The logical operators combine truth values, which are normally represented in C as numbers. Any expression with a numeric value is a valid truth value: zero means false, and any other value means true. A pointer type is also meaningful as a truth value; a null pointer (which is zero) means false, and a non-null pointer means true (see Pointer Types). The value of a logical operator is always 1 or 0 and has type `int` (see Integer Data Types).

The logical operators are used mainly in the condition of an `if` statement, or in the end test in a `for` statement or `while` statement (see Statements). However, they are valid in any context where an integer-valued expression is allowed.

‘`! exp`’

  Unary operator for logical “not.” The value is 1 (true) if exp is 0 (false), and 0 (false) if exp is nonzero (true).

  Warning: If exp is anything but an lvalue or a function call, you should write parentheses around it.

‘`left && right`’

  The logical “and” binary operator computes left and, if necessary, right. If both of the operands are true, the ‘`&&`’ expression gives the value 1 (true). Otherwise, the ‘`&&`’ expression gives the value 0 (false). If left yields a false value, that determines the overall result, so right is not computed.

‘`left || right`’

  The logical “or” binary operator computes left and, if necessary, right. If at least one of the operands is true, the ‘`||`’ expression gives the value 1 (which is true). Otherwise, the ‘`||`’ expression gives the value 0 (false). If left yields a true value, that determines the overall result, so right is not computed.

Warning: Never rely on the relative precedence of ‘`&&`’ and ‘`||`’. When you use them together, always use parentheses to specify explicitly how they nest, as shown here:

    if ((r != 0 && x % r == 0)
        ||
        (s != 0 && x % s == 0))