• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Re: Short-circuit evaluation
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Short-circuit evaluation


  • Subject: Re: Short-circuit evaluation
  • From: Michael Ash <email@hidden>
  • Date: Tue, 23 Jun 2009 10:24:23 -0400

On Tue, Jun 23, 2009 at 8:16 AM, Graham Cox<email@hidden> wrote:
>
> On 23/06/2009, at 10:03 PM, Igor Mozolevsky wrote:
>
>> BOOL someValue = [object returnsBool] | [anotherObject alsoReturnsBool];
>>
>> which is a bitwise OR of two YESes, essentially.
>
>
> OK, makes sense... and since ||= is not valid, there should be no hidden
> gotcha with organising things this way.
>
> I was running into a problem with short-circuit evaluation with BOOL foo =
> [a bar] || [b baz]; where baz wasn't being called. Splitting the code down
> to
>
> BOOL foo = [a bar] | [b baz]; will always call baz but the result <foo> will
> be identical...

The result is not guaranteed to be identical. It probably won't
*matter*, but [a bar] || [b baz] is guaranteed to always be 0 or 1,
whereas [a bar] | [b baz] could be any integer value (depending, of
course, on what bar and baz return).

Assuming bar and baz both return BOOL, then you just have the
potential for a non-one version of "true" in foo, which is fine. If,
however, bar and baz return, say, int, then you have the potential to
have non-zero values with the least-significant byte containing 0, at
which point foo will contain NO. Bad news.

> The problem crops up in combining calls to -validateMenuItem:, where the
> validation not only returns YES or NO but may also have side effects like
> changing the state of item. The call must be made even if the actual result
> is logically redundant.

I would like to suggest that your solution is less than ideal. A
programmer coming back through your code is likely to miss the fact
that there is only one pipe symbol instead of two, due to the fact
that the logical operator would be expected in code dealing with BOOL.
He is therefore likely to commit the opposite mistake you did: that of
assuming that the expression will short-circuit, and then being
confused when it does not.

If both expressions must be evaluated, then store them into separate
variables before combining them. Or better yet, if possible, redesign
your code so that it does not require side effects of boolean
expressions to happen in the first place.

Mike
_______________________________________________

Cocoa-dev mailing list (email@hidden)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:

This email sent to email@hidden

  • Follow-Ups:
    • Re: Short-circuit evaluation
      • From: Graham Cox <email@hidden>
References: 
 >Short-circuit evaluation (From: Graham Cox <email@hidden>)
 >Re: Short-circuit evaluation (From: Igor Mozolevsky <email@hidden>)
 >Re: Short-circuit evaluation (From: Igor Mozolevsky <email@hidden>)
 >Re: Short-circuit evaluation (From: Graham Cox <email@hidden>)

  • Prev by Date: Re: Beginner Question Re: Memory Management
  • Next by Date: Debugging NSService
  • Previous by thread: Re: Short-circuit evaluation
  • Next by thread: Re: Short-circuit evaluation
  • Index(es):
    • Date
    • Thread