c – 为什么Visual Studio在自我赋值时不会发出警告(int foo = foo;)

我正在重构一个出现在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编译器并不是警告/错误中主动性的黄金标准.

上一篇:c-SSE半载(_mm_loadh_pi / _mm_loadl_pi)发出警告


下一篇:PHP usort()期望参数2是有效的回调,而不是在类中