Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 1898490
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 17, 20262026-05-17T06:46:17+00:00 2026-05-17T06:46:17+00:00

Sorry for opening this topic again, but thinking about this topic itself has started

  • 0

Sorry for opening this topic again, but thinking about this topic itself has started giving me an Undefined Behavior. Want to move into the zone of well-defined behavior.

Given

int i = 0;
int v[10];
i = ++i;     //Expr1
i = i++;     //Expr2
++ ++i;      //Expr3
i = v[i++];  //Expr4

I think of the above expressions (in that order) as

operator=(i, operator++(i))    ; //Expr1 equivalent
operator=(i, operator++(i, 0)) ; //Expr2 equivalent
operator++(operator++(i))      ; //Expr3 equivalent
operator=(i, operator[](operator++(i, 0)); //Expr4 equivalent

Now coming to behaviors here are the important quotes from C++ 0x.

$1.9/12- “Evaluation of an expression
(or a sub-expression) in general
includes both value computations
(including determining the identity of
an object for lvalue evaluation and
fetchinga value previously assigned to
an object for rvalue evaluation) and
initiation of side effects.”

$1.9/15- “If a side effect on a scalar
object is unsequenced relative to
either another side effect on the same
scalar object or a value
computation using the value of the
same scalar object, the behavior is
undefined.”

[ Note: Value computations and side
effects associated with different
argument expressions are unsequenced.
—end note ]

$3.9/9- “Arithmetic types (3.9.1),
enumeration types, pointer types,
pointer to member types (3.9.2),
std::nullptr_t, and cv-qualified
versions of these types (3.9.3) are
collectively called scalar types.”

  • In Expr1, the evaluation of the expression i (first argument), is unsequenced with respect to the evaluation of the expession operator++(i) (which has a side effect).

    Hence Expr1 has undefined behavior.

  • In Expr2, the evaluation of the expression i (first argument), is unsequenced with respect to the evaluation of the expession operator++(i, 0) (which has a side effect)’.

    Hence Expr2 has undefined behavior.

  • In Expr3, the evaluation of the lone argument operator++(i) is required to be complete before the outer operator++ is called.

    Hence Expr3 has well defined behavior.

  • In Expr4, the evaluation of the expression i (first argument) is unsequenced with respect to the evaluation of the operator[](operator++(i, 0) (which has a side effect).

    Hence Expr4 has undefined behavior.

Is this understanding correct?


P.S. The method of analyzing the expressions as in OP is not correct. This is because, as @Potatoswatter, notes – “clause 13.6 does not apply. See the disclaimer in 13.6/1, “These candidate functions participate in the operator overload resolution process as described in 13.3.1.2 and are used for no other purpose.” They are just dummy declarations; no function-call semantics exist with respect to built-in operators.”

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-17T06:46:18+00:00Added an answer on May 17, 2026 at 6:46 am

    Native operator expressions are not equivalent to overloaded operator expressions. There is a sequence point at the binding of values to function arguments, which makes the operator++() versions well-defined. But that doesn’t exist for the native-type case.

    In all four cases, i changes twice within the full-expression. Since no ,, ||, or && appear in the expressions, that’s instant UB.

    §5/4:

    Between the previous and next sequence point a scalar object shall have its stored value modified at most once by the evaluation of an expression.

    Edit for C++0x (updated)

    §1.9/15:

    The value computations of the operands of an operator are sequenced before the value computation of the result of the operator. If a side effect on a scalar object is unsequenced relative to either another side effect on the same scalar object or a value computation using the value of the same scalar object, the behavior is undefined.

    Note however that a value computation and a side effect are two distinct things. If ++i is equivalent to i = i+1, then + is the value computation and = is the side effect. From 1.9/12:

    Evaluation of an expression (or a sub-expression) in general includes both value computations (including determining the identity of an object for glvalue evaluation and fetching a value previously assigned to an object for prvalue evaluation) and initiation of side effects.

    So although the value computations are more strongly sequenced in C++0x than C++03, the side effects are not. Two side effects in the same expression, unless otherwise sequenced, produce UB.

    Value computations are ordered by their data dependencies anyway and, side effects absent, their order of evaluation is unobservable, so I’m not sure why C++0x goes to the trouble of saying anything, but that just means I need to read more of the papers by Boehm and friends wrote.

    Edit #3:

    Thanks Johannes for coping with my laziness to type “sequenced” into my PDF reader search bar. I was going to bed and getting up on the last two edits anyway… right ;v) .

    §5.17/1 defining the assignment operators says

    In all cases, the assignment is sequenced after the value computation of the right and left operands, and before the value computation of the assignment expression.

    Also §5.3.2/1 on the preincrement operator says

    If x is not of type bool, the expression ++x is equivalent to x+=1 [Note: see … addition (5.7) and assignment operators (5.17) …].

    By this identity, ++ ++ x is shorthand for (x +=1) +=1. So, let’s interpret that.

    • Evaluate the 1 on the far RHS and descend into the parens.
    • Evaluate the inner 1 and the value (prvalue) and address (glvalue) of x.
    • Now we need the value of the += subexpression.
      • We’re done with the value computations for that subexpression.
      • The assignment side effect must be sequenced before the value of assignment is available!
    • Assign the new value to x, which is identical to the glvalue and prvalue result of the subexpression.
    • We’re out of the woods now. The whole expression has now been reduced to x +=1.

    So, then 1 and 3 are well-defined and 2 and 4 are undefined behavior, which you would expect.

    The only other surprise I found by searching for “sequenced” in N3126 was 5.3.4/16, where the implementation is allowed to call operator new before evaluating constructor arguments. That’s cool.

    Edit #4: (Oh, what a tangled web we weave)

    Johannes notes again that in i == ++i; the glvalue (a.k.a. the address) of i is ambiguously dependent on ++i. The glvalue is certainly a value of i, but I don’t think 1.9/15 is intended to include it for the simple reason that the glvalue of a named object is constant, and cannot actually have dependencies.

    For an informative strawman, consider

    ( i % 2? i : j ) = ++ i; // certainly undefined
    

    Here, the glvalue of the LHS of = is dependent on a side-effect on the prvalue of i. The address of i is not in question; the outcome of the ?: is.

    Perhaps a good counterexample is

    int i = 3, &j = i;
    j = ++ i;
    

    Here j has a glvalue distinct from (but identical to) i. Is this well-defined, yet i = ++i is not? This represents a trivial transformation that a compiler could apply to any case.

    1.9/15 should say

    If a side effect on a scalar object is unsequenced relative to either another side effect on the same scalar object or a value computation using the prvalue of the same scalar object, the behavior is undefined.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

Sorry if this is a newbie question. I have searched but found nothing... Using
Sorry for a long question but here goes. I am trying to modify the
Sorry, the question is not programming related but I have nowhere else to ask,
Sorry for the long title. In essence, I want to accomplish the same thing
(Note - this is a re-post as my first question got posted under wrong
Sorry I didn't explain My problem correctly , My problem is that I have
Sorry for unclear title - I don't know how to describe that problem in
Sorry for the strange title. Here is my situation. I have a table of
Right now I can show a div by clicking a button, and hide it
I have a VPS running a VPS optimized Debian distro. I am very new

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.