If-statement with && operator checks for 2nd value?

11,288

Solution 1

No, it does not evaluate the expression after learning that the answer is going to be NO. This is called short-circuiting, and it is an essential part of evaluating boolean expressions in C, C++, Objective C, and other languages with similar syntax. The conditions are evaluated left to right, making the evaluation scheme predictable.

The same rule applies to the || operator: as soon as the code knows that the value is YES, the evaluation stops.

Short-circuiting lets you guard against invalid evaluation in a single composite expression, rather than opting for an if statement. For example,

if (index >= 0 && index < Length && array[index] == 42)

would have resulted in undefined behavior if it were not for short-circuiting. But since the evaluation skips evaluation of array[index] when index is invalid, the above expression is legal.

Solution 2

Objective-C uses lazy evaluation, which means that only the left operand is evaluated in your case.

Share:
11,288
Roland Keesom
Author by

Roland Keesom

iOS developer by day / superhero by night

Updated on June 15, 2022

Comments

  • Roland Keesom
    Roland Keesom over 1 year

    Does an if-statement with an && operator check for the second parameter if the first one is false / NO?

    Would the following be able to crash?

    NSDictionary *someRemoteData = [rawJson valueForKey:@"data"];
    if( [someRemoteData isKindOfClass:[NSDictionary class]] && someRemoteData.count > 0 ){
        //..do something
    }
    

    Please no simple yes or no answer, but explain why.

  • fge
    fge almost 11 years
    Not to mention that conditions are evaluated in their order of appearances ;) Java has the bizarre-behaving & which does not shortcut, too.
  • Sergey Kalinichenko
    Sergey Kalinichenko almost 11 years
    @fge Thanks for the note about the evaluation order, this is very important in the context of this discussion.
  • Roland Keesom
    Roland Keesom almost 11 years
    Thanks for clarifying. I already assumed it did, just wanted to know exactly why.