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

Why is there not any warning on a declaration without initialization in a for loop?

本文关键字:声明 任何 警告 初始化 循环 为什么 for      更新时间:2023-10-16

我尝试使用g++ (gcc版本4.8.2 (Debian 4.8.2-1))编译以下代码,带有-Wall标志(添加-Wextra标志对我来说不会改变任何东西)。

#include <iostream>
using namespace std ;
int main() {
    int i ;
    cout << i << endl ;
}

它给出了这样的警告:

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

但是下面的代码没有产生任何警告:

#include <iostream>
using namespace std ;
int main() {
    for(int i ; i < 10 ; i++) {
        cout << i << endl ;
    }
}

我做了进一步的检查。

以下命令产生警告:

#include <iostream>
using namespace std ;
int main() {
    int i ;
    while(i<10) {
        cout << i << endl ;
    }
}

#include <iostream>
using namespace std ;
int main() {
    int i ;
    while(i<10) {
        cout << i << endl ;
        i++ ;
    }
}

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

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

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

该链接声明如下:

GCC能够警告用户使用未初始化变量的值。这样的值是未定义的,并且永远不会有用。它甚至不能作为一个随机值,因为它很少是一个随机值。不幸的是,在一般情况下,检测何时使用未初始化的变量等同于解决停止问题。GCC尝试通过使用优化器收集的信息来检测一些实例,并在命令行中给出-Wuninitialized选项时发出警告。在目前的执行中,有一些明显的缺点。首先,它仅在通过-O1、-O2或-O3启用优化时有效。第二,假阳性或假阴性的集合根据所启用的优化而变化。这也会导致在两个版本之间添加或修改优化时报告的警告的高度可变性。

实际上,当我添加这些标志之一时,编译器会产生警告。