清如许 发表于 2022-9-30 20:27:11

这两个代码算出来结果为啥不一样啊

本帖最后由 清如许 于 2022-9-30 20:46 编辑

代码一
#include <stdio.h>
#include <math.h>

int main()
{
    unsigned long long int a;
    unsigned long long int temp;
    unsigned long long int sum;
    unsigned long long int b;
       
        for (a=0;a<64;a++)
      {
          b=pow(2,a);
          sum=b+temp;
          temp=b;
       }

      printf("%llu\n",sum);

      return 0;

}



代码二
#include <stdio.h>
#include <math.h>

int main()
{
      unsigned long long sum = 0;
      unsigned long long temp;
      int i;

      for (i=0; i < 64; i++)
      {
                temp = pow(2, i);
                sum = sum + temp;
      }

      printf("%llu\n", sum);
      
      return 0;
}

清如许 发表于 2022-9-30 20:35:44

请教各位了

清如许 发表于 2022-9-30 20:45:35

第一个是13835058055282163712第二个是18446744073709551615

jackz007 发表于 2022-9-30 20:48:28

本帖最后由 jackz007 于 2022-9-30 20:51 编辑

      代码一是错的。
#include <stdio.h>
#include <math.h>

int main()
{
      unsigned long long int a , b , temp , sum ;
      for (a = 0 ; a < 64 ; a ++) {
                b = pow(2 , a)                  ;
                sum = b + temp                  ; // temp 未赋初值,每个 b 会反复被加 2 次
                temp = b                        ; // 让 temp = b,准备下回再加一次?
      }
      printf("%I64u\n",sum)                     ;
      return 0;
}
      代码二是正确的,有一点需要注意,在 Windows 平台上,显示 64 位整型要服从微软的规矩,scanf()、printf() 的格式描述符要用 "%I64u",不要用 "%lld",除非可以正常显示。

七分君 发表于 2022-9-30 20:50:43

我这运算的结果,两个一样,你的不一样?

清如许 发表于 2022-9-30 20:50:46

jackz007 发表于 2022-9-30 20:48
代码一是错的。

哦哦哦,谢谢大佬,但我百度看变量为赋值的话默认是0啊?

清如许 发表于 2022-9-30 20:52:10

七分君 发表于 2022-9-30 20:50
我这运算的结果,两个一样,你的不一样?

我的不一样5555

清如许 发表于 2022-9-30 20:52:45

七分君 发表于 2022-9-30 20:50
我这运算的结果,两个一样,你的不一样?

第一个是13835058055282163712第二个是18446744073709551615

jackz007 发表于 2022-9-30 20:54:30

本帖最后由 jackz007 于 2022-9-30 21:05 编辑

清如许 发表于 2022-9-30 20:50
哦哦哦,谢谢大佬,但我百度看变量为赋值的话默认是0啊?

         即便 temp 初值是 0,代码一也是严重错误的。
         其实,这道题很简单,根本就没有那么多的是非
#include <stdio.h>

int main(void)
{
      unsigned long long int a , b , i , sum         ;
      for(sum = a = 0 ; a < 64 ; a ++) {
                for(b = 1 , i = 0 ; i < a ; i ++) b *= 2 ;
                sum += b                                 ;
      }
      printf("%I64u\n",sum)                            ;
}
      编译、运行实况:
D:\\C>g++ -o x x.c

D:\\C>x
18446744073709551615

D:\\C>

清如许 发表于 2022-9-30 21:06:49

jackz007 发表于 2022-9-30 20:54
即便 temp 初值是 0,代码一也是严重错误的。
         其实,这道题很简单,根本就没有那么 ...

为什么b会被加2次呢

清如许 发表于 2022-9-30 21:10:18

jackz007 发表于 2022-9-30 20:54
即便 temp 初值是 0,代码一也是严重错误的。
         其实,这道题很简单,根本就没有那么 ...

谢谢大佬指点
页: [1]
查看完整版本: 这两个代码算出来结果为啥不一样啊