为什么没有在for循环中初始化的声明没有任何警告?

Tom*_*ize 5 c++ warnings initialization g++ declaration

我尝试使用g ++(gcc版本4.8.2(Debian 4.8.2-1))编译以下代码,带有-Wall标志(添加-Wextra标志不会改变我的任何内容).

#include <iostream>

using namespace std ;

int main() {
    int i ;
    cout << i << endl ;
}
Run Code Online (Sandbox Code Playgroud)

它给出了这个警告:

test.cpp: In function ‘int main()’:
test.cpp:7:13: warning: ‘i’ is used uninitialized in this function [-Wuninitialized]
    cout << i << endl ;
Run Code Online (Sandbox Code Playgroud)

但是以下代码不会产生任何警告:

#include <iostream>

using namespace std ;

int main() {
    for(int i ; i < 10 ; i++) {
        cout << i << endl ;
    }
}
Run Code Online (Sandbox Code Playgroud)

我做了进一步的测试.

以下产生警告:

#include <iostream>

using namespace std ;

int main() {
    int i ;
    while(i<10) {
        cout << i << endl ;
    }
}
Run Code Online (Sandbox Code Playgroud)

但以下不是:

#include <iostream>

using namespace std ;

int main() {
    int i ;
    while(i<10) {
        cout << i << endl ;
        i++ ;
    }
}
Run Code Online (Sandbox Code Playgroud)

在上面的程序中,如果我替换了while一个if,那么我有一个警告.

对此有一些解释吗?为什么编译器在某些情况下可以识别问题,而在其他情况下却没有,尽管它们看起来非常接近?

Tom*_*ize 3

感谢Pradhan提供了这个链接,我明白了这个问题。

该链接声明如下:

GCC 能够警告用户使用未初始化变量的值。这样的值是未定义的,并且永远没有用处。它甚至不能作为随机值,因为它很少是随机值。不幸的是,在一般情况下,检测何时使用未初始化的变量相当于解决停止问题。GCC 尝试使用优化器收集的信息来检测某些实例,并在命令行中给出选项 -Wuninitialized 时发出警告。目前的实施中存在一些明显的缺陷。首先,它仅在通过 -O1、-O2 或 -O3 启用优化时才起作用。其次,误报或漏报的集合根据启用的优化而变化。当在版本之间添加或修改优化时,这也会导致报告的警告存在很大差异。

事实上,当我添加这些标志之一时,编译器会发出警告。