【发布时间】:2018-04-19 02:41:06
【问题描述】:
例如:
#include<iostream>
using namespace std;
int main() {
int i = i=0; //no warning
cout << i << endl;
return 0;
}
在 vs2015 中编译,没有警告并输出 0。虽然看起来有点奇怪,但这段代码 sn-p 是否定义明确?
但是,在这个 online compiler (g++ prog.cc -Wall -Wextra -std=c++17) 中,它会引发以下警告:
prog.cc: In function '`int main()`':
prog.cc:8:12: warning: operation on '`i`' may be undefined [-Wsequence-point]
`int i=i=0;`
【问题讨论】:
-
请注意,此处的“修改”一词与“分配”不是同义词。我很确定像
int i = i += 5这样的东西not 是明确定义的。不过我对此一无所知。 -
@PatrickRoberts
int i = i&0;怎么样?这里“赋值”可能更好,但是“修改”可以。因为你说的是在它的未定义值的基础上修改,这是修改的另一种情况。 -
我很确定我知道答案,但是除了无聊的好奇心之外,你还有什么理由需要知道这个吗?
-
我担心标准可能允许
i=0运行,然后i被初始化为未指定的状态,然后i从i初始化。我还担心在第一次初始化之前对i的写入/读取可能是未定义的,而不仅仅是未指定的值。你使用int的事实让我不太确定。 -
@PatrickRoberts 不仅对结果感到好奇,我很困惑为什么在 c++ 中允许这样的语句,如
int i=i=0而不是int i=0。似乎i在它之前使用定义。
标签: c++ language-lawyer undefined-behavior