首页 > 解决方案 > 声明中的 `declarator = initializer` 是赋值表达式吗?

问题描述

在 C11 标准中

6.5.16 赋值运算符语法

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

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

6.7 声明

句法

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

是否=declarator = initializer赋值运算符中?

declarator = initializer在声明中是赋值表达式吗?

我的问题来自评估`int x = -2147483648`时会发生什么?

谢谢。

标签: cvariable-assignmentdeclaration

解决方案


=在这种情况下,字符不是赋值运算符,而是声明语法的一部分。

这类似于如何,用作逗号运算符、函数参数的分隔符或声明的分隔符。在这两种情况下,语言都可以从周围的上下文中知道它是如何被使用的。

关于语法declarator = initializer,它不是赋值表达式,但initializer它是。从 6.7.9p1 开始:

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

这意味着您可以这样做:

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

推荐阅读