把二进制转换十进制,循环的地方交换位置为什么出错?

「已注销」
领域专家: 后端开发技术领域
2013-09-25 12:11:43
int main(){

cout<<"请输入8位二进制的数:"<<endl;
char ch;
int i=7,sum=0;

for(;i>=0;i--) {

cin>>ch;
if(ch=='1')
sum += power(2,i);
}
cout<<"转换后的十进制数位:"<<sum<<endl;
return 0;
}

double power(double x,int n){
double r=1.0;
while(n--){
r *=x;
}


return r;
}

如果for循环改为这样为什么出错?
for(;i>=0;) {
i--;
cin>>ch;
if(ch=='1')
sum += power(2,i);
}
...全文
144 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2013-09-25
  • 打赏
  • 举报
回复
引用 8 楼 qzf362269994 的回复:
[quote=引用 6 楼 zhang5476499 的回复:] [quote=引用 5 楼 qzf362269994 的回复:] 在C语言中,非零数表示真(true),零表示假(false)。 while(n) 如果n为负数时,while条件为真
但是我的判断条件不是while(n--)啊,而是while(n>=0) 当n==-1时,while里面是(false).[/quote] double power(double x,int n){ double r=1.0; while(n--){ r *=x; } 这不是你自己写的吗 难道我眼花? [/quote]哦,是我看错了。我以为你指的循环是main函数的循环,原来死循环出在power函数里面。在for(;i>=0;);相当于while(i>=0);所以我以为你指的是mian函数的循环。
赵4老师 2013-09-25
  • 打赏
  • 举报
回复
for (A;B;C) D;
//等价于
{
 A;
 while (1) {
  if (!(B)) break;
  D;
  C;
 }
}
赵4老师 2013-09-25
  • 打赏
  • 举报
回复
仅供参考
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>
int main() {
    int i,v;
    char bs[33];
    char b[33];
    char hs[9];
    char h[9];
    char s[4];
    char *e;

// 十进制整数转二进制串;
    i=1024;
    ltoa(i,b,2);
    sprintf(bs,"%032s",b);
    printf("i=%d,bs=%s\n",i,bs);
// 十进制整数转十六进制串;
    i=1024;
    ltoa(i,h,16);
    sprintf(hs,"%08s",h);
    printf("i=%d,hs=%s\n",i,hs);
// 十六进制字符串转成十进制数
    strcpy(hs,"00000400");
    sscanf(hs,"%x",&i);
    printf("hs=%s,i=%d\n",hs,i);
// 二进制字符串转化为十六进制字符串;
    strcpy(bs,"00000000000000000000010000000000");
    i=strtol(bs,&e,2);
    ltoa(i,h,16);
    sprintf(hs,"%08s",h);
    printf("bs=%s,hs=%s\n",bs,hs);
// 二进制字符串转化为十进制数;
    strcpy(bs,"00000000000000000000010000000000");
    i=strtol(bs,&e,2);
    printf("bs=%s,i=%d\n",bs,i);
// 十六进制字符串转成二进制串
    strcpy(hs,"00000400");
    sscanf(hs,"%x",&i);
    ltoa(i,b,2);
    sprintf(bs,"%032s",b);
    printf("hs=%s,bs=%s\n",hs,bs);
// ASC\GBK字符串转十六进制串
    strcpy(s,"a汉");
    i=0;
    while (1) {
        if (0==s[i]) break;
        sprintf(hs+i*2,"%02X",(unsigned char)s[i]);
        i++;
    }
    setlocale(LC_ALL,"chs");
    printf("s=%s,hs=%s\n",s,hs);
// 十六进制字符串转成汉字(GBK)及字符(ASC)
    strcpy(hs,"61BABA");
    i=0;
    while (1) {
        if (1!=sscanf(hs+i*2,"%2x",&v)) break;
        s[i]=(char)v;
        i++;
    }
    s[i]=0;
    printf("hs=%s,s=%s\n",hs,s);

    return 0;

}
//i=1024,bs=00000000000000000000010000000000
//i=1024,hs=00000400
//hs=00000400,i=1024
//bs=00000000000000000000010000000000,hs=00000400
//bs=00000000000000000000010000000000,i=1024
//hs=00000400,bs=00000000000000000000010000000000
//s=a汉,hs=61BABA
//hs=61BABA,s=a汉
_BigBoy 2013-09-25
  • 打赏
  • 举报
回复
一进入函数就执行i-- i = 6,5,4,3,2,1,0 只换算了7位
qzf362269994 2013-09-25
  • 打赏
  • 举报
回复
引用 6 楼 zhang5476499 的回复:
[quote=引用 5 楼 qzf362269994 的回复:] 在C语言中,非零数表示真(true),零表示假(false)。 while(n) 如果n为负数时,while条件为真
但是我的判断条件不是while(n--)啊,而是while(n>=0) 当n==-1时,while里面是(false).[/quote] double power(double x,int n){ double r=1.0; while(n--){ r *=x; } 这不是你自己写的吗 难道我眼花?
  • 打赏
  • 举报
回复
楼主你没弄明白 for(;i>=0;i--) 是怎么执行的。。。 这条语句,先执行i>=0,然后执行循环体,再执行的是 i--; 在判断i>=0是否为真,然后再执行循环体,再执行的是 i--; 如果是for(;i>=0;) { i--; 执行的顺序就变了,先执行i>=0,然后执行循环体,相对于上一个语句,这个i--是在上个循环体之前执行。
「已注销」 2013-09-25
  • 打赏
  • 举报
回复
引用 5 楼 qzf362269994 的回复:
在C语言中,非零数表示真(true),零表示假(false)。 while(n) 如果n为负数时,while条件为真
但是我的判断条件不是while(n--)啊,而是while(n>=0) 当n==-1时,while里面是(false).
qzf362269994 2013-09-25
  • 打赏
  • 举报
回复
在C语言中,非零数表示真(true),零表示假(false)。 while(n) 如果n为负数时,while条件为真
qzf362269994 2013-09-25
  • 打赏
  • 举报
回复
你的方法2 像你输入(0000 0011) 他最后一次循环是power(2,-1),while循环当然跳不出
「已注销」 2013-09-25
  • 打赏
  • 举报
回复
引用 2 楼 max_min_ 的回复:
i每次循环进来就 进行了自减一次了!

// 方法1
for(;i>=0;)
{

cin>>ch;
if(ch=='1')
sum += power(2,i);
i--;
}

//方法2
int i = 8;
for(;i>0;)
{
i--;
cin>>ch;
if(ch=='1')
sum += power(2,i);
}

方法二是错的,这个程序。不知道怎么回事,按照方法一就有输出,而方法二程序好像是死循环。输出窗口一动不动。
max_min_ 2013-09-25
  • 打赏
  • 举报
回复
i每次循环进来就 进行了自减一次了!

// 方法1 
for(;i>=0;) 
{

    cin>>ch;
    if(ch=='1')
      sum += power(2,i);
    i--;
 }

//方法2
int i = 8;
for(;i>0;) 
{
    i--;
    cin>>ch;
    if(ch=='1')
      sum += power(2,i);
}

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧