> On Oct 13, 2015, at 3:24 PM, Graham Cox <graham....@bigpond.com> wrote:
> 
> In a piece of code I haven’t worked on in a while, I’m suddenly getting a new 
> warning which I’ve never seen before:
> 
> “Multiple unsequenced modifications to ‘ix’”
> 
> Code is:
> 
> ix = ++ix % guess.count;
> 
> where ix is a NSUInteger.
> 
> Is this telling me that the order of the preincrement and the mod operation 
> is undefined? Surely a preincrement is defined to happen first, that’s why 
> it’s called a PREincrement? Or does the warning refer to something else? I’ve 
> used this form of expression for years without any issues, why is it suddenly 
> one?

The mod operator uses the value after the increment. That part is well-defined.

The compiler is complaining about the two stores to `ix`, one from the 
preincrement and one from operator =. Storing to the same location twice in the 
same statement is undefined in many cases: the language does not specify which 
one wins. Look up "sequence point" for more details (although the current 
language standards no longer use the "sequence point" terminology).

I thought that this particular form was allowed, but I'm not enough of a 
language lawyer to know for sure. You might get better answers from a compiler 
mailing list.

You can avoid confusion (human and compiler) by writing the statement without 
the preincrement's side effect:
    ix = (ix+1) % guess.count;


-- 
Greg Parker     gpar...@apple.com     Runtime Wrangler



_______________________________________________

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:
https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to