relative precedence of ?: and assignment

Discussion in 'C++' started by Andrew Koenig, Jul 12, 2003.

  1. It has been pointed out to me that various C++ books disagree about
    the relative precedence of ?: and the assignment operators.

    In order to satisfy myself about the matter once and for all,
    I looked at the grammar in the C++ standard. The relative fragments
    are as follows:

    conditional-expression:
    logical-or-expression
    logical-or-expression ? expression : assignment-expression

    assignment-expression:
    conditional-expression
    logical-or-expression assignment-operator assignment-expression
    throw-expression

    Ordinarily, this grammar is almost, but not quite, in a well-known
    form that, were it adhered to exactly, would say that
    conditional-expressions have higher precedence than
    assignment-expressions.

    However, there is one crucial difference from this form: The rightmost
    token in the second line of "conditional-expression" is
    "assignment-expression" rather than "conditional-expression".
    This difference makes the grammar somewhat harder to understand in
    terms of precedence.

    However, if we take the definition of assignment-expression and
    replace the use of conditional-expression by its alternatives, we get:

    assignment-expression:
    logical-or-expression
    logical-or-expression ? expression : assignment-expression
    logical-or-expression assignment-operator assignment-expression
    throw-expression

    which we can rewrite this way:

    cond-or-asn-op:
    assignment-operator
    ? expression :

    assignment-expression:
    logical-or-expression
    logical-or-expression cond-or-asn-op assignment-expression
    throw-expression

    From this rewrite, it should be clear that the assignment and ?:
    operators have the same precedence, and they are right-associative.

    Am I missing anything? If not, I'd like to urge all authors and
    teachers of C++ to describe the precedence of these operators this
    way; I think it's much easier to understand than any alternatives I've
    seen.


    --
    Andrew Koenig,
     
    Andrew Koenig, Jul 12, 2003
    #1
    1. Advertising

  2. Andrew Koenig wrote: <about "teaching">
    [...]
    > Am I missing anything?


    Uhmm,

    "The syntax specifies the precedence of operators in the evaluation
    of an expression, which is the same as the order of the major
    subclauses of this subclause, highest precedence first. Thus, for
    example, the expressions allowed as the operands of the binary +
    operator (6.5.6) are those expressions defined in 6.5.1 through
    6.5.6. The exceptions are cast expressions (6.5.4) as operands of
    unary operators (6.5.3), and an operand contained between any of
    the following pairs of operators: grouping parentheses () (6.5.1),
    subscripting brackets [] (6.5.2.1), function-call parentheses ()
    (6.5.2.2), and the conditional operator ?: (6.5.15)."

    regards,
    alexander.

    --
    "Good job SUN -- you've soiled yourselves with the stink of the
    new pariah. The enemy of your enemy in this case was not your
    friend. I hope IBM buys your sorry assets out, because we're
    done with you."
    -- "teambpsi" @ slashdot
     
    Alexander Terekhov, Jul 12, 2003
    #2
    1. Advertising

  3. Alexander> "The syntax specifies the precedence of operators in the
    Alexander> evaluation of an expression, which is the same as the order
    Alexander> of the major subclauses of this subclause, highest
    Alexander> precedence first. Thus, for example, the expressions
    Alexander> allowed as the operands of the binary + operator (6.5.6)
    Alexander> are those expressions defined in 6.5.1 through 6.5.6. The
    Alexander> exceptions are cast expressions (6.5.4) as operands of
    Alexander> unary operators (6.5.3), and an operand contained between
    Alexander> any of the following pairs of operators: grouping
    Alexander> parentheses () (6.5.1), subscripting brackets [] (6.5.2.1),
    Alexander> function-call parentheses () (6.5.2.2), and the conditional
    Alexander> operator ?: (6.5.15)."

    Regardless of what the descriptive material may say, it does not add
    any additional constraints to the grammar. Putting it differently,
    if the grammar requires an expression to be parsed in a particular
    way, then that is the way it's parsed.

    --
    Andrew Koenig,
     
    Andrew Koenig, Jul 12, 2003
    #3
  4. Andrew Koenig wrote:
    >
    > Alexander> "The syntax specifies the precedence of operators in the
    > Alexander> evaluation of an expression, which is the same as the order
    > Alexander> of the major subclauses of this subclause, highest
    > Alexander> precedence first. Thus, for example, the expressions
    > Alexander> allowed as the operands of the binary + operator (6.5.6)
    > Alexander> are those expressions defined in 6.5.1 through 6.5.6. The
    > Alexander> exceptions are cast expressions (6.5.4) as operands of
    > Alexander> unary operators (6.5.3), and an operand contained between
    > Alexander> any of the following pairs of operators: grouping
    > Alexander> parentheses () (6.5.1), subscripting brackets [] (6.5.2.1),
    > Alexander> function-call parentheses () (6.5.2.2), and the conditional
    > Alexander> operator ?: (6.5.15)."
    >
    > Regardless of what the descriptive material may say, it does not add
    > any additional constraints to the grammar. Putting it differently,
    > if the grammar requires an expression to be parsed in a particular
    > way, then that is the way it's parsed.


    You might want to take a look at *C* grammer. Or am I just missing
    and/or misunderstanding something?

    regards,
    alexander.

    --
    "Freedom is a perceived necessity. Freedom of speech is NOT saying
    whatever you want. The sooner as you realize that, the better your
    life is going to be."
    -- Victor Bazarov
     
    Alexander Terekhov, Jul 12, 2003
    #4
  5. Andrew Koenig

    Pete Becker Guest

    Alexander Terekhov wrote:
    >
    > You might want to take a look at *C* grammer. Or am I just missing
    > and/or misunderstanding something?
    >


    C and C++ are different here. Deliberately.

    --

    "To delight in war is a merit in the soldier,
    a dangerous quality in the captain, and a
    positive crime in the statesman."
    George Santayana

    "Bring them on."
    George W. Bush
     
    Pete Becker, Jul 12, 2003
    #5
  6. Andrew Koenig

    Pete Becker Guest

    Alexander Terekhov wrote:
    >
    > Pete Becker wrote:
    > >
    > > Alexander Terekhov wrote:
    > > >
    > > > You might want to take a look at *C* grammer. Or am I just missing
    > > > and/or misunderstanding something?
    > > >

    > >
    > > C and C++ are different here. Deliberately.

    >
    > Heck. Why there should be any difference with respect to "relative
    > precedence of ?: and assignment" in C and C++?????


    Because we changed it.

    a ? b : c = 3;

    In C, b is unchanged, regardless of the value of a. In C++, depending on
    the value of a, 3 is assigned to either b or c.

    --

    "To delight in war is a merit in the soldier,
    a dangerous quality in the captain, and a
    positive crime in the statesman."
    George Santayana

    "Bring them on."
    George W. Bush
     
    Pete Becker, Jul 12, 2003
    #6
  7. Pete Becker wrote:
    >
    > Alexander Terekhov wrote:
    > >
    > > Pete Becker wrote:
    > > >
    > > > Alexander Terekhov wrote:
    > > > >
    > > > > You might want to take a look at *C* grammer. Or am I just missing
    > > > > and/or misunderstanding something?
    > > > >
    > > >
    > > > C and C++ are different here. Deliberately.

    > >
    > > Heck. Why there should be any difference with respect to "relative
    > > precedence of ?: and assignment" in C and C++?????

    >
    > Because we changed it.


    Interesting. Very interesting. It seems that both Annex C and
    http://david.tribble.com/text/cdiffs.htm know *nothing* about
    that change. Oder?

    regards,
    alexander.
     
    Alexander Terekhov, Jul 12, 2003
    #7
  8. Andrew Koenig

    Pete Becker Guest

    Pete Becker wrote:
    >
    > Alexander Terekhov wrote:
    > >
    > > Pete Becker wrote:
    > > >
    > > > Alexander Terekhov wrote:
    > > > >
    > > > > You might want to take a look at *C* grammer. Or am I just missing
    > > > > and/or misunderstanding something?
    > > > >
    > > >
    > > > C and C++ are different here. Deliberately.

    > >
    > > Heck. Why there should be any difference with respect to "relative
    > > precedence of ?: and assignment" in C and C++?????

    >
    > Because we changed it.
    >


    Apparently we didn't. <g> There was a lengthy discussion of how to do
    it, complete with ad hoc BNF on whiteboards. Looks like it didn't make
    it into the standard.

    --

    "To delight in war is a merit in the soldier,
    a dangerous quality in the captain, and a
    positive crime in the statesman."
    George Santayana

    "Bring them on."
    George W. Bush
     
    Pete Becker, Jul 13, 2003
    #8
  9. Pete Becker wrote:
    [...]
    > > > Heck. Why there should be any difference with respect to "relative
    > > > precedence of ?: and assignment" in C and C++?????

    > >
    > > Because we changed it.
    > >

    >
    > Apparently we didn't. <g>


    Thanks god. ;-)

    > There was a lengthy discussion of how to do
    > it, complete with ad hoc BNF on whiteboards. Looks like it didn't make
    > it into the standard.


    <from my email archive>

    "Official/legal" C may allow use of conditional expressions as
    lvalues in the future, oder? I really want to have *the same*
    rules in both C and C++ with respect to "relative precedence of
    ?: and assignment".

    regards,
    alexander.
     
    Alexander Terekhov, Jul 14, 2003
    #9
  10. Alexander> "Official/legal" C may allow use of conditional expressions
    Alexander> as lvalues in the future, oder? I really want to have *the
    Alexander> same* rules in both C and C++ with respect to "relative
    Alexander> precedence of ?: and assignment".

    The question I am addressing is not what you or I want, but what the
    C++ standard actually says.

    --
    Andrew Koenig,
     
    Andrew Koenig, Jul 14, 2003
    #10
  11. Andrew Koenig

    Ron Natalie Guest

    "Andrew Koenig" <> wrote in message news:...
    > Alexander> "The syntax specifies the precedence of operators in the
    > Alexander> evaluation of an expression, which is the same as the order
    > Alexander> of the major subclauses of this subclause, highest
    > Alexander> precedence first. Thus, for example, the expressions
    > Alexander> allowed as the operands of the binary + operator (6.5.6)
    > Alexander> are those expressions defined in 6.5.1 through 6.5.6. The
    > Alexander> exceptions are cast expressions (6.5.4) as operands of
    > Alexander> unary operators (6.5.3), and an operand contained between
    > Alexander> any of the following pairs of operators: grouping
    > Alexander> parentheses () (6.5.1), subscripting brackets [] (6.5.2.1),
    > Alexander> function-call parentheses () (6.5.2.2), and the conditional
    > Alexander> operator ?: (6.5.15)."
    >
    > Regardless of what the descriptive material may say, it does not add
    > any additional constraints to the grammar. Putting it differently,
    > if the grammar requires an expression to be parsed in a particular
    > way, then that is the way it's parsed.
    >

    One thing people must realize is that the precedence ordering is noit
    the same as the grammar. You can't strictly reflect the grammar in
    this case with the table.
     
    Ron Natalie, Jul 14, 2003
    #11
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. nagy
    Replies:
    36
    Views:
    1,022
    Terry Reedy
    Jul 20, 2006
  2. Chris
    Replies:
    34
    Views:
    1,550
  3. Daniel DeLorme

    operator precedence of assignment

    Daniel DeLorme, Jan 2, 2007, in forum: Ruby
    Replies:
    1
    Views:
    112
    Phrogz
    Jan 2, 2007
  4. matt neuburg
    Replies:
    7
    Views:
    115
    matt neuburg
    May 8, 2008
  5. Uncle Roastie

    Functions and assignment precedence question

    Uncle Roastie, Sep 2, 2011, in forum: Javascript
    Replies:
    3
    Views:
    790
    Dr J R Stockton
    Sep 7, 2011
Loading...

Share This Page