谁帮我解决个小问题???

72877588 2003-12-24 02:57:52
void main()
{
char a;
while(1)
{
if(a!='!')
{
scanf("%c",&a);
printf("%c",a);
}
else
break;
}

}

当我把char i 改成 int i 就有问题了 当我输入!时 怎么就循环了?
...全文
54 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
huanmm 2003-12-24
  • 打赏
  • 举报
回复
我明白了
是这样的(挖塞,说来话长,喝点水先)

首先
在c里面(在我的机子上)
int 占用4个字节
char 占用1个字节

其次(这一点是我的猜测)
数据存储的时候是低位在前,高位在后

那么
当a为int型的时候
给他scanf一个char
因为char只占一位
所以改写的是他的最开头的一个字节也就是最低位的一个字节

那么
如果初始值小于等于255
a的高三位都为00
改写了他的最低位就相当于改写了整个四位

而当初始值大于255的时候
比如257
在内存里面就是
01 01 00 00
改写了他的最低位(比如输入一个'!')
但是次低位并没有改变
他的值就变成
33 01 00 00

最后把a的值(按照上例)就是256 + 33 = 289
而'!'的ascii码是33
所以当然有289 != 33

再回到你的程序
如果给定一个小于256的初始值就没有问题
如果不给定初始值
那么系统自动给的值很可能就大于等于256
于是出现上面的问题

over
(累死我了
感谢skywarship(很菜的小李)
因为我原来也不知道有这样的问题)

arfi 2003-12-24
  • 打赏
  • 举报
回复
a&0xff!='!' ===> (a&0xff)!='!'


°★.☆° .★·°∴°★.°·∴°☆ ·°∴° ☆..·

☆°★°∴°°∴ ☆°.·★°∴°.
◢◣。 ◢◣。 ☆圣★
◢★◣。 ◢★◣。 ★诞☆
◢■■◣。 ◢■■◣。 ☆节★
◢■■■◣。 ◢■■■◣。 ★快☆
︸︸||︸︸ !!︸︸||︸︸ ☆乐★
祝圣诞节快乐 ^_^!!☆°★°∴°°∴ ☆°.·★°∴°.

°★.☆° .★·°∴°★.°·∴°☆ ·°∴° ☆..·.
huanmm 2003-12-24
  • 打赏
  • 举报
回复
我现在只能跟你说
如果改成int型的话
给a赋一个初值就好了

但是至于为什么
我也不是太清楚
可能skywarship(很菜的小李) 说的是对的
mostideal 2003-12-24
  • 打赏
  • 举报
回复
你看看!和‘!’是一回事吗?
skywarship 2003-12-24
  • 打赏
  • 举报
回复
void main()
{
int a;
while(1)
{
if(a&0xff!='!') //改成这样
{
scanf("%c",&a);
printf("%c",a);
}
else
break;
}

}
skywarship 2003-12-24
  • 打赏
  • 举报
回复
当然,你输入“!”,实际a!='!',所以循环了
72877588 2003-12-24
  • 打赏
  • 举报
回复
不 错了 是 char a 改成 int a

69,371

社区成员

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

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