下面将我的上课笔记分享出来,都是一些我们容易犯错的地方,希望对你们有所帮助。
1.点击(此处)折叠或打开
- #define MAX 280
- #define N 7
- int
- main(void)
- {
- unsigned char i;
- int n, result = 0;
- for(n = 0, i = n; n < MAX; n++, i++)
- result += (i % N == 0) ? i : 0;
- printf("result: %d\n", result);
- }
运行结果: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.
- int
- fun(int x)
- {
- int y = 0;
- static int z = 1;
-
- x = y + (z++) + x;
- return x;
- }
- int
- main(void)
- {
- int i;
-
- for(i = 0; i <= 2; ++i)
- printf("%d ", fun(i));
- return 0;
- }
运行结果:1 3 5
分析:这道题其实没有什么难度,重点在于static。fun()中定义的static int z = 1,z是一个静态局部变量。只要程序没有结束,z就没有释放。所以,当循环调用fun()时,z的值在不断累加。最后,程序结束时,z = 4
阅读(850) | 评论(0) | 转发(0) |