Chinaunix首页 | 论坛 | 博客
  • 博客访问: 524705
  • 博文数量: 257
  • 博客积分: 1666
  • 博客等级: 上尉
  • 技术积分: 1535
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-02 23:02
文章分类

全部博文(257)

文章存档

2013年(2)

2012年(255)

分类:

2012-08-31 13:44:46

原文地址:C陷阱与缺陷(一) 作者:licong0527

   下面将我的上课笔记分享出来,都是一些我们容易犯错的地方,希望对你们有所帮助。

   1.点击(此处)折叠或打开
  1. #define MAX 280
  2. #define N 7

  3. int
  4. main(void)
  5. {
  6.     unsigned char i;
  7.     int n, result = 0;

  8.     for(n = 0, i = n; n < MAX; n++, i++)
  9.            result += (i % N == 0) ? i : 0;
  10.     printf("result: %d\n", result);
  11. }

运行结果:4704
 分析:这个程序初看没什么问题,貌似很简单。但是运行一下,你就会发现,与你的答案有所出入。这个题目的考点在于数据类型,大家注意一下变量i是unsigned char类型,这也就说明i的取值范围在0~255之间。而程序的循环次数为MAX=280次,由此可知,i不会自增到280,那样会超出它的取值范围。
           由于result这个变量所加的i都是7的倍数,i的范围又在0~255之间。那么,result所能加的i的最大值为252。不过,n是控制循环次数的变量,所以循环仍要继续运行。当n=256时,此时i已经超出了它本身的范围,所以i又从0开始(注意啦:无符号数是不存在溢出的,所以不会变成负数的哦)。在256~279之间,共可以进行279-256=23次循环,即i可以从0开始,自增到22。其间,i加到result上的值分别为7、14、21。
            最终结果:
                         0+7+14+21+...252 + 0+7+14+21 = 4704

2. 分析表达式 i = *p++。
分析:这个提目考察了算符优先级。很简单但却非常容易出错。
          在有些书上说,++的优先级高于*运算符。有些书上说,++的优先级等于*优先级。这个让我很纠结,不过还好结果都是一样的。
         对于第一种说法,++的优先级高于*运算符。不过,要注意++的位置是后置的。所以先进行i = *p,再进行p++操作。
         第二种呢,++的优先级等于*运算符。只不过,运算符的结合顺序是从右向左。所以上式为i = *(p++),++是后置的,先进行i = *p, 再进行p++。
         特别说明一下,赋值运算符=的优先级低于*和++。事实上,p先保存了一份备份,p进行了++操作,保存了另一份值,最后将最初的p(未++的p)赋值给i。上面那样写,只是为了方便理解。

3. int (*p)[5] 与 int *p[5]的区别:
分析:这是指针数组与数组指针问题。
          int (*p)[5]:定义了一个数组指针。首先p是一个指针,其次p指向一个定义了5个元素的数组。
          int *p[5]:定义了一个指针数组。p首先与[]结合,那么p时一个含有5个元素的数组,而int*就是数组的类型,即p是一个含有5个int*类型的数组。
          数组指针与指针数组这两个名字让人区分起来很痛苦,所以我们只要知道它到底是一个数组还是一个指针就好。

4. int *const p 与 const int *p的区别:
分析:这道题考察了指针与const限定符之间的关系。
         int *const p:const指针。即指针的值不能改变,但是可以改变指针所指向的内容。
         const int *p:指向const对象的指针。即指针的指向可以改变,但是不能修改内容。

5. 

点击(此处)折叠或打开

  1. int
  2. fun(int x)
  3. {
  4.     int y = 0;
  5.     static int z = 1;
  6.      
  7.     x = y + (z++) + x;

  8.     return x;
  9. }
  10. int
  11. main(void)
  12. {
  13.     int i;
  14.     
  15.     for(i = 0; i <= 2; ++i)
  16.         printf("%d ", fun(i));

  17.      return 0;
  18. }
运行结果:1 3 5
分析:这道题其实没有什么难度,重点在于static。fun()中定义的static int z = 1,z是一个静态局部变量。只要程序没有结束,z就没有释放。所以,当循环调用fun()时,z的值在不断累加。最后,程序结束时,z = 4
阅读(598) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~