当前位置: 首页 > 知识库问答 >
问题:

为什么我的代码在初始化变量时给我的答案与添加像0这样的简单值时不同?[重复]

秦伯寅
2023-03-14

下面有两个不同的代码。两者之间的区别只是对于变量sum,sum是初始化的,而不是给sum值0 sum=0;

#include <iostream>
using namespace std;
int main(){
    
    //This code will display first ten numbers and get the sum of it
    cout << "The natural numbers are: " << endl;
     for(int i=1; i<=10; i++)
     {
         cout << i << " ";
         
     }
    cout << endl;
// variable was initialized 
    int sum;
    cout << "The sum of first 10 natural numbers: ";
    for(int i=1; i<=10; i++)
      {
          sum = sum +i;
      }
    cout << sum;

    cout << endl;
    
}

此代码输出:

自然数是:1 2 3 4 5 6 7 8 9 10

前 10 个自然数之和:32821

程序以退出代码结束:0

#include <iostream>
using namespace std;
int main(){
    //This code will display first ten numbers and get the sum of it
    cout << "The natural numbers are: " << endl;
     for(int i=1; i<=10; i++)
     {
         cout << i << " ";
         
     }
    cout << endl;
// here I gave the value 1... this time it worked
    int sum =0;
    cout << "The sum of first 10 natural numbers: ";
    for(int i=1; i<=10; i++)
      {
          sum = sum +i;
      }
    cout << sum;

    cout << endl;
    
}

此代码输出:

自然数是:1 2 3 4 5 6 7 8 9 10

前10个自然数之和:55

程序以退出代码结束:0

代码为什么要这样做?有人能给我解释一下为什么他们给了我两个不同的数目吗?

共有3个答案

曹兴贤
2023-03-14

激活编译器标志-Wun初始化

在第一个程序中,sum保持未初始化并包含垃圾值。因此,您会得到错误。OTOH,在第二个程序中,sum的值被初始化为0,正好是零,因此计数成功。

巫马善
2023-03-14

实际上,在第一组代码中,编译器取变量<code>和。此值<code>32766

所以在第二种情况下,你们给了sum一个初始值,所以编译器知道用户给了一个值。因此,它将相应地执行给定的操作。在循环内部,将从0开始,并继续执行给定的操作,直到它退出循环。这种情况2代码的操作如下所示:

    sum = sum + i; //(here value of "i" increase by 1 with iteration of the given loop)
   /* 1 = 0 + 1
    3 = 1 + 2
    6 = 3 + 3
    10 = 6 + 4
    15 = 10 + 5
    21 = 15 + 6
    28 = 21 + 7
    36 = 28 + 8
    45 = 36 + 9
    55 = 45 + 10
    As you can see the value of "sum" after the loop is 55
    */

但在第一种情况下,您没有给出sum初始值,因此编译器不知道sum的值是0、6、15、7还是10。所以,编译器为它取了一个随机值,在您的情况下是32766。在循环内,它从32766开始并继续其给定的操作。Case1代码的操作如下:-

   sum = sum + i; //(like previous case here too value of "i" increase by 1 with iteration of the given loop)
    /* 32767 = 32766 + 1
    32769 = 32767 + 2
    32772 = 32769 + 3
    32776 = 32772 + 4
    32781 = 32776 + 5
    32787 = 32781 + 6
    32794 = 32787 + 7
    32802 = 32794 + 8
    32811 = 32802 + 9
    32821 = 32811 + 10
    Here you can see the value of "sum" after the operation is 32821
    */

好吧!总结所有内容,您的逻辑和代码在我看来很好,但在第一种情况下,sum的值是由编译器随机分配的,所以在第一种情况下一切都出错了。

佴阳曦
2023-03-14

如果你不初始化< code>sum,它就有一个不确定的值,你无法知道它将执行什么操作。读取未初始化的变量是未定义的行为,这样做会导致整个程序无效。

顺便说一句;你似乎对什么是初始化感到困惑。int sum;不会初始化sum,它只是声明它-它不会给它一个初始值,并且您可能不会读取它或在计算中使用它,直到您为它分配了一个已知值。int sum=0;确实初始化sum-也就是说,它给它一个初始值,您现在可以有效地读取它并在计算中使用它。

 类似资料:
  • 给定一个0和1的数组,我们最多可以将K个值从0更改为1。 返回仅包含1的最长(连续)子数组的长度。 例1: 例2: 注: https://leetcode.com/problems/max-consecutive-ones-iii/ 这是问题链接。在第一个测试用例中,我得到了输出9,但应该是6。我不知道哪里出了问题?

  • 问题内容: 每次尝试编译时,它表明变量可能未初始化。我认为可能是问题所在。告诉我如何在中运行2条语句。 问题答案: d1不在else块中且仅在if或else if块中初始化,因此,如果if()和elseif()块中的所有语句均为false,则控制器进入else块,而d1仍然不是初始化。因此,当您尝试在system.out.println()中访问它时,编译器正确地抛出该错误。您可能想在一开始将值初

  • 对java来说真的很陌生,并且在这个任务中遇到了一些麻烦。任务是: 编写一个简单的计算器程序,打印欢迎消息,接受用户的简单算术表达式,并执行请求的操作。程序应重复此操作,直到两个操作数都为0,然后退出。 它运行得很好,但我不确定如何获得While循环的句柄,以便计算器将继续运行,直到答案为0。抱歉,如果这是一个非常基本的问题。任何帮助都将不胜感激。

  • 问题内容: 我在程序中看到了与程序中此特定循环相关的不同行为,但我不确定我为什么理解它的行为方式。 的输出是 的输出是 我去网上看了以下内容 在切片上进行测距时,每次迭代都会返回两个值。第一个是索引,第二个是该索引处的元素的副本 它说一个副本,这是否意味着它返回了字符串的副本,但这实际上是指向变量的指针?在这种情况下,在循环结束时对will的任何引用都实际上引用了数组中的最后一个元素,例如?这是否

  • 我遇到了一个有趣的问题,我不明白发生了什么: 据我所知,我提供的单个整数参数可以解释为使用参数调用构造函数,也可以解释为使用初始化列表的构造函数。似乎只有当我提供左值时才调用initialiser_list构造函数,但当我提供r-value(至少是文字)时,构造函数。为什么会这样? 这也意味着: 结果仅为大小为1的向量; 结果是一个大小为num\u元素的向量,但我认为应该避免这种初始化,因为偶尔会

  • 问题内容: 我有一个简单的程序: 当我运行该程序时,我看到的只是用于输出。我原本希望我们会遇到第一轮,然后是,然后是etc。 这是由于这样的事实,一旦我们尝试在左侧重新声明,其值就会重置为? 如果有人可以指出我的详细情况,那将很棒。 更改为,似乎正在按预期方式打印数字。我对它达到最大32位值的速度感到惊讶! 问题答案: 该问题是由于整数溢出引起的。 在32位二进制补码算法中: 确实确实开始具有2的