On Tue, Jun 23, 2009 at 8:16 AM, Graham Cox<graham....@bigpond.com> 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 (Cocoa-dev@lists.apple.com) 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: http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com This email sent to arch...@mail-archive.com