【发布时间】:2019-03-16 16:20:14
【问题描述】:
C++17标准通过stating, to the effect规则修改了C++语言的运算顺序定义:
在每个简单的赋值表达式 E1=E2 和每个复合 赋值表达式 E1@=E2,每个值的计算和副作用 E2 在每个值计算和副作用之前排序 E1
但是,在 GCC 8.1 中使用 -std=c++17 和 -Wall 编译以下代码时
int v[] { 0,1,2,3,4,5,6,7 };
int *p0 = &v[0];
*p0++ = *p0 + 1;
cout << "v[0]: " << v[0] << endl;
我收到以下警告:
main.cpp:266:8: warning: operation on 'p0' may be undefined [-Wsequence-point]
*p0++ = *p0 + 1;
~~^~
输出是:
v[0]: 1
问题是:警告是否错误?
【问题讨论】:
-
当然,标准表明
*p0 + 1将在左侧的任何内容之前进行评估。由于++是后缀,因此无论是否对其进行评估都不会影响对v[0]的分配。真正的问题是p0现在是否指向v[1]。 -
无警告here
-
@Jans 你要加
-Wall -
@Jans 您已关闭警告。添加
-Wall
标签: c++ c++17 assignment-operator operator-precedence