一道困扰我很久的C语言题目,一段小程序

来源:百度知道 编辑:UC知道 时间:2024/07/07 20:33:52
字符串按f(p)=p*11 mod 256替代,若计算后的值小于等于32,则该字符不变
下面两个程序运行后产生不同的结果,而程序只有极小的差别,不知道是什么原因?这样的程序到底该怎么写
程序一:
#include<stdio.h>
main()
{
char s[10]="china";
char t;
int i;
clrscr();
for(i=0;i<5;i++)
{
t=s[i]*11%256;
if(t<=32)
;
else
s[i]=t;
}
printf("%s",s);
}
程序二:
#include<stdio.h>
main()
{
char s[10]="china";
char t;
int i;
clrscr();
for(i=0;i<5;i++)
{
t=s[i]*11%256;
if(s[i]*11%256<=32)/*不一样的地方*/
;
else
s[i]=t;
}
printf("%s",s);
}

if(t<=32)

t是字符型,只占8位,最高位为符号位,当i=2时,s[i]*11%256的值是131,二进制最高位是1,所以系统将它解释为一个负数-125,所以t<=32成立,所以就不会执行s[i]=t,i=3时情况也相同,所以没有修改原来的元素值。

if(s[i]*11%256<=32)
s[i]是字符型,而11和256都是整型,所以s[i]将进行整型提升,类型自动转换为整型,整型至少点16位(现在的系统中都是32位),所以当i=2时,s[i]*11%256的值是131,所以(s[i]*11%256<=32)不成立,所以就要进行s[i]=t的操作,把131转换为char类型,也就是一个负数赋值给s[i],而负数ASCII码在GBK编码中是汉字的编码,i=3时的情况也一样,所以会输出汉字。

看到了匿名的达人了。

忽视了char,我以为你用的是int。

失误了,不过,真是正解。

谢谢你的例子,让我们再次看到类型转换的重要性!

其中的t和s[i]*11%256并不等价;由下面的程序可以看出来。
#include<stdio.h>
main()
{
char s[10]="china";
char t;
int i;
for(i=0;i<5;i++)
{
t=s[i]*11%256;
printf("%d\t%d\n",t,s[i]*11%256);//加一了一句
if(s[i]*11%256<=32)/*不一样的地方*/
;
else
s[i]=t;
}
printf("%s",s);
}
其运行的结果为:
65 65
120 120
-125 131
-70 186
43 43
Ax儿+请按任意键继续. . .