c - 声明中的 `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`时会发生什么?
谢谢。
解决方案
=
在这种情况下,字符不是赋值运算符,而是声明语法的一部分。
这类似于如何,
用作逗号运算符、函数参数的分隔符或声明的分隔符。在这两种情况下,语言都可以从周围的上下文中知道它是如何被使用的。
关于语法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
推荐阅读
- gremlin - 如何在 gremlin 查询中将多个对象合并为一个?
- apache - 删除查询字符串参数并将其放入路径中
- python-3.x - Flask 应用程序:Heroku Postgres 无法从数据库加载记住的用户
- powershell - 从 Powershell 中的 TRAP 中排除错误代码
- c# - C# 和 EF Core 中具有相同结构的动态表名
- python - 具有 np.where 条件的列的切片字符串不起作用
- mingw - MSYS angleproject 构建 - 补丁问题
- android - 添加 .aar 文件后无法调试 android 应用程序
- css - 使用css在顶部和右侧的半彩色边框
- javascript - 在 Django 中从字典中存储文件