c语言中常见问题的分析(张老师c语言课堂后我的总结)

1.数据的溢出问题

数据有其固定的表示范围,因此当数据的值超出了其范围时,将出现溢出问题。

#include

int  main( )

{      

int a,b;  

a=0x7fff;

b=a+1;

  printf("%d,%d\n",a,b);  

  return 0;

}

在上面这段程序中,变量a的值为32767,它在内存中的表示为: a: 0111 1111 1111 1111 当a加上1后,内存中的表示为: 1000 0000 0000 0000,它的实际十进制值为 -32768,因为int类型包括了它的符号,它的第一位会表示该数的正负,超过了这个int类型所能表示的范围,实际上溢出问题为数据类型的选择错误,在这里我们可以用unsigned int或long来表示变量,于是便把所能表示的数据范围变大。

2. 无符号整数与有符号整数的混合运算问题

#include

void main( )

{    

 int x = 1;      

unsigned int y = 2;    

 printf("x - y = %d , (x - y)/2 = %d \n",x - y , (x - y)/2);

}

输出结果为: x – y = -1 , (x - y)/2 = 32767 按照常理,我们认为(1 - 2)/2结果应该为-0.5,截去小数后,结果应为 -1,但事实上并非如此,而是得到结果32767。

变量x,y的值分别为1和2,它在内存中的表示为:

x:  0000 0000 0000 0001

y:  0000 0000 0000 0010

二者做减法时,-y的运算是把y取补码,然后加一,再与x运算,根据C语言中的类型自动转换原则,计算 结果的类型应为无符号整型数。因为两个不同类型的数据运算时,结果会输出高级的那个,无符号整数型比有符合整数高级。其结果在内存中的存放形 式为: x – y:  1111 1111 1111 1111,因为表达式类型为无符号型,所以(x – y)/2即“逻辑右移”1位 其结果在内存中的存放形式为: (x – y)/2:  0111 1111 1111 1111 即使仍以有符号数的形式输出,也还是32767。而不是我们 按常理应得到的数字-1。而为什么第一个能够输出,这是因为右边用%d,运算时就按照整型进行运算律。

3.书写标识符时,忽略了大小写字母的区别 

在c语言编辑中,大小字母是不同的,注意规范。

4.忽略变量的类型,进行了不合法的运算

include

void main()

  {        

float x,y;    

printf("%d",x%y);

  }  

%是求余运算,得到x/y后的整余数。整型变量x和y可以进行求余运算,而浮点型变量则不允许进行“求余”运算。

5.忽略了“=”与“==”的区别  

数学里,“=”做赋值和恒等两用

但C语言中,“=”是赋值运算符,   “= =” 是关系运算符。

故判断是否相等时是一定不能用=的,应该使用==。

6.将字符常量与字符串常量混淆

字符常量 是由一对单引号括起来的单个字符,

字符串常量是 一对双引号括起来的字符序列。

你可能感兴趣的:(c语言)