If-statement with && operator checks for 2nd value?
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.
Comments
-
Roland Keesom over 1 year
Does an
if-statement
with an&& operator
check for the second parameter if the first one isfalse
/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 almost 11 yearsNot to mention that conditions are evaluated in their order of appearances ;) Java has the bizarre-behaving
&
which does not shortcut, too. -
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 almost 11 yearsThanks for clarifying. I already assumed it did, just wanted to know exactly why.