我正在重构一个出现在bazilion时代的术语,偶然我产生了如下代码中的情况:
#include "stdafx.h"
#include <iostream>
int foo = foo;
//By replacing with the following instruction we causes a compile error
//int foo(foo);
int _tmain(int argc, _TCHAR* argv[])
{
int bar = bar;
std::cout << "Well this is awkward " << foo << std::endl;
return 0;
}
使用不同的调试和发布配置,编译器对int foo = foo;保持沉默.
我没有看到这种说法不是等待发生的错误的情况. Visual Studio编译器不应该发出警告吗?
我不是假装这是一个未定义的行为.我说默认情况下,从变量到自身的赋值可能是程序员的错误.除非有人使用赋值运算符有一个奇怪的方案.
解决方法:
类似的问题(i = i)确实是未定义的行为,但主要是因为指令包含对同一变量的两个赋值:
> i(i)的递增,这是在指令i返回i之后的某个点完成的
>我的任务
问题是我们无法真正知道i的赋值是在增量之前还是之后发生,因此未定义的行为.
在你的例子中,foo = foo,我们有一个read,然后是write.毫不含糊地,我们必须在写入之前读取该值,因此很容易定义.
另一个注意事项是,如果重新定义了operator =,那么foo = foo可以做很多不仅仅是foo副本的东西. C有目的地允许您以多种不同方式拍摄食物.但无论如何,C编译器并不是警告/错误中主动性的黄金标准.