Search code examples
cvariable-assignmentdeclaration

Is `declarator = initializer` in a declaration an assignment expression?


In the C11 standard

6.5.16 Assignment operators Syntax

assignment-expression:
conditional-expression
unary-expression  assignment-operator  assignment-expression

assignment-operator: one of = *= /= %= += -= <<=  >>=  &=  ^=  |=

6.7 Declarations

Syntax

declaration:
declaration-specifiers init-declarator-listopt ;
static_assert-declaration
declaration-specifiers:
storage-class-specifier  declaration-specifiersopt
type-specifier  declaration-specifiersopt
type-qualifier  declaration-specifiersopt
function-specifier  declaration-specifiersopt
alignment-specifier  declaration-specifiersopt
init-declarator-list:
init-declarator
init-declarator-list , init-declarator
init-declarator:
declarator
declarator = initializer

Is = in declarator = initializer an assignment operator?

Is declarator = initializer in a declaration an assignment expression?

My question comes from What happens when evaluating `int x = -2147483648`?


Solution

  • The = character in this case is not an assignment operator, but part of the syntax of a declaration.

    This is similar to how , can be used as the comma operator, a separator for function arguments, or a separator for declarations. In both cases, the language knows from the surrounding context how exactly it is being used.

    Regarding the syntax declarator = initializer, it is not an assignment expression, however initializer is. From 6.7.9p1:

    initializer:
      assignment-expression
      {initializer-list}
      {initializer-list,}
    

    Which means you can do this:

    int x;
    int y = x = 3;   // the second = is an assignment operator, the first one is not