【问题标题】:Why am I getting the error "using uninitialized memory 'i'" and "uninitialized local variable 'i' used" when trying to make i = i*i为什么在尝试使 i = i*i 时出现错误“使用未初始化的内存 'i'”和“使用了未初始化的局部变量 'i'”
【发布时间】:2021-01-22 18:24:36
【问题描述】:

我是 C++ 新手,正在测试 while 循环和 C++ 的绝对速度及其对我的 CPU 的影响,我收到以下错误:

Severity Code Description Project File Line Suppression State Warning C6001 Using uninitialized memory 'i'
Severity Code Description Project File Line Suppression State Error 4700 uninitialized local variable 'i' used

我不知道如何阅读错误消息,甚至还没有遇到 C++ 中的初始化,所以我不知道该怎么做。

#include <iostream>
using namespace std;
    
int main() {
    long long i = 0;
    while (i < 10000000000000000) {
        long long i = i*i;
        cout << i ;
    }
    cout << i;
    return 0;
}

【问题讨论】:

  • 您有两个不同且截然不同且完全不相关的变量,均名为i。为什么不直接打印i * i 的结果 而不是用那个名字定义一个新变量?
  • long long i = i*i;i的值是多少,当你乘它的时候?事实上,在上面的范围内有一个同名的变量,没有任何改变,因为它被这个声明所掩盖。

标签: c++ compiler-errors increment


【解决方案1】:

在while循环体中

while (i < 10000000000000000) {
    long long i = i*i;
    cout << i ;
}

您声明的变量i 未初始化且具有不确定值,并且您正尝试使用此不确定值来初始化变量本身。

在这个声明中

    long long i = i*i;

在初始化器中使用了相同的声明变量 i,它隐藏了在循环之前出现的同名变量的声明

用声明代替声明

   i = i*i;

但最初您应该将变量 i 设置为不等于 0 的某个值,例如设置为 10。

long long i = 10;

否则表达式i * i的结果总是等于0。

类似

#include <iostream>
using namespace std;

int main() {
    long long i = 10;
    while (i < 10'000'000'000'000'000) {
        i = i*i;
        cout << i ;
    }
    cout << i;
    return 0;
}

虽然您应该谨慎选择变量i 的初始值,因为表达式i * i 中可能会发生溢出,并且您会出现无限循环。

【讨论】:

    【解决方案2】:

    long long i = i * i; 隐藏了在 while 循环外声明的 long long i = 0;。它是一个完全独立的变量,您正在尝试将其初始化为自己的平方值。如果你想使用你在循环外声明的变量i,去掉重新声明:

    #include <iostream>
    using namespace std;
    
    int main() {
        long long i = 0;
        while (i < 10000000000000000) {
            i = i*i;
            cout << i ;
        }
        cout << i;
        return 0;
    }
    

    请注意,这将是一个无限循环,只会一遍又一遍地打印0

    【讨论】:

    • 谢谢你和0部分我不知道我在想什么
    猜你喜欢
    • 1970-01-01
    • 2022-01-05
    • 2012-06-11
    • 2020-12-06
    • 2021-09-26
    • 1970-01-01
    • 1970-01-01
    • 2017-06-26
    • 2017-10-23
    相关资源
    最近更新 更多